数据结构之表达式二叉树

   java中的树是一种重要的非线性数据结构,我们之前学习的,数组,列表属于线性的数据结构, 直观的的看,Java中的树是数据元素(我们在Java的树中我们称为结点)按照分支的关系组织起来的结构,二叉树则是每个结点最多只有两个子树的有序树,在二叉树中的子树通常称为左子树和右子树。 

我们要讲的表达式二叉树是什么呢:怎么生成表达式二叉树呢?下面我举个列子来介绍一下 ,我们在生成表达式二叉树时有个规则:即结点位置放运算符而子节点位置放数据  比如1+2我们的树形结构就如下:

数据结构之表达式二叉树_第1张图片

 下面我们以a+b+c-d这个表达式列子来详细介绍一下表达式而叉树:这表达式的数据有“a,b,c,d”符号有“+,+,-”。首先我们从表达式中取两个数据比如a和b,再从表达式中取一个符号“+”,如图所示

数据结构之表达式二叉树_第2张图片

 接下来我们假定上图算出一个结果,我们把上图看做一个子节点并且命名为num我们继续从表达式中取一个数据c,一个符号“+”把上图看做作为一个左子树,如下面左图所示,最后实际生成如下面有图所示的结构

 数据结构之表达式二叉树_第3张图片数据结构之表达式二叉树_第4张图片

 以此类推,我们接下来把上图中的有图的结构看成一个左子树,再从表达式中取一个数据d一个符号“-”,结构如下图所示,

数据结构之表达式二叉树_第5张图片

于是我们表达式a+b+c-d的树形结构就如上图所示了 ,接下来我们从代码上来实现它,

首先第一步:我们根据之前的分析,我创建两个列表一个用来存表达式的数据,一个用来存表达式的符号,

接着第二步:分别从存数据的列表中取出前两个数据,从存符号的列表中取出前面的一个符号,构成一个结点,并且在此时移除数据列表中的前两个数据和符号列表中的前一个符号数据并且把构成的节点存到数据列表的第一个位置,重复此操作直到符号数据取完。

第三步:让根节点等于最后的一个结点

代码如下:首先我们创建一个结点类:

public class Nodetree {
	
	public Nodetree left;//左结点
	public Nodetree right;//右节点
	public String data;//数据类型
	
	public Nodetree(){
		
		
	}
	public String getdata(){
		return data;
		
	}
	
	public Nodetree(String data){
		this.data=data;
		
	}

}

 接着是生成树类:运用递归方式采用中序遍历:

public class TreeDamo {
	
	private Nodetree root;//根结点
	
	
	public void add(){
		//创建一个列表存放表达式的符号
		ArrayList fuhao=new ArrayList();
		//创建一个列表用于存放表达式的数和字符
		ArrayList number=new ArrayList();
	
		fuhao.add(new Nodetree("+"));
		fuhao.add(new Nodetree("+"));
		fuhao.add(new Nodetree("-"));
		number.add(new Nodetree("a"));
		number.add(new Nodetree("b"));
		number.add(new Nodetree("c"));
		number.add(new Nodetree("d"));
		
		
		
		while(fuhao.size()>0){
			
			Nodetree num1=number.remove(0);//将number列表对象中的要移除第1个赋值给num1结点,
			Nodetree num2=number.remove(0);//将number列表对象中的要移除第1个赋值给num2结点,
			Nodetree fuhao1=fuhao.remove(0);//将fuhao列表对象中的要移除第1个赋值给fuhao1结点,
			
			fuhao1.left=num1;//符号结点左边加num1对象
			
			fuhao1.right=num2;//符号结点左边加num12对象
			
			number.add(0, fuhao1);//把fuhao1结点放入number列表对象的第一个
			
		}
		
		root=number.get(0);//让根结点等于最后一个结点
		
		
	}
	public void print(){
		print(root);
	}
	/*
	 * 采用递归方式,中序遍历
	 */
	public void print(Nodetree node){
		
		if(node.left!=null){
			print(node.left);
		}
		System.out.print(node.getdata()+" ");
		if(node.right!=null){
			print(node.right);
		}
		
		
	}
	public static void main(String args[]){
		TreeDamo pp=new TreeDamo();
		pp.add();
		pp.print();
		
	}

}

 

 最后结果为:

数据结构之表达式二叉树_第6张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构)