java表达式二叉树的构建

表达式二叉树的定义:

通过自然表达式的优先级顺序,构建出与表达式相应的二叉树模型,这样的二叉树模型就是表达式二叉树。

例如:(a*c+b)-d*e 这样的一个表达式,表达式二叉树的存放规则是:数据放在子节点位置,符号放在父节点(或根节点)位置

下面是这个例子的表达式二叉树的模型:

步骤就是先计算a*c,再计算a*c+b,然后再计算d*e,最后计算(a*c+b)-(d*e)

 下面我来详细介绍下它的步骤:

第一步:先取出前两个数和第一个运算符,如下图所示,

第二步:再将得到的结果(假设为x)作为一个数字放回数组数列,在重复第一步。得到如下图所示:

第三步:然后再重复第二步就可以得到表达式二叉树的模型;

下面再来讲一讲构建表达式二叉树编写代码的具体步骤:

1.创建一个节点类,在结点类中可以定义前序遍历、中序遍历、后序遍历,以便后面调用。

2.根据表达式,分别将数字和符号存到两个不同的节点类数组队列中。

3.取出数组队列的前两个数和前一个符号构成一个新的节点,然后删除取出的前两个数和前一个符号,在将这个节点放到存放数字的数组队列的第一位;

4.重复第3步

5.将最后构成的结点赋值给根节点

下面是代码:

一.结点类的代码:

在结点类中,前序遍历、中序遍历、后序遍历主要是运用了递归算法。

public class Node {
Node left;
Node right;
String data;
public Node(){}
public Node(String data){
	this.data=data;
}
//前序遍历
public void frontbianli(Node n){
	System.out.println(n.data);//输出结点n的数据
	if(n.left!=null)
	n.frontbianli(n.left);
	if(n.right!=null)
	n.frontbianli(n.right);	
}
//中序遍历
public void middlebianli(Node n){
	if(n.left!=null){
		n.middlebianli(n.left);
	}
	System.out.println(n.data);//输出结点n的数据
	if(n.right!=null){
		n.middlebianli(n.right);
	}	
}
//后序遍历
public void behindbianli(Node n){
	if(n.left!=null){
		n.behindbianli(n.right);
	}
	System.out.println(n.data);//输出结点n的数据
	if(n.right!=null){
		n.behindbianli(n.left);
	}	
}
}

 二.创建一个二叉树的类

下面是代码:

import java.util.ArrayList;

public class twotree {
Node root=null;//初始化根结点
public void creattree(){
	ArrayList<Node>number =new ArrayList<Node>();//创建一个结点类型数组队列,用来存放数字
	ArrayList<Node>symbol =new ArrayList<Node>();//创建一个结点类型数组队列,用来存放符号
	number.add(new Node("1"));//添加元素
	number.add(new Node("2"));
	number.add(new Node("6"));
	number.add(new Node("8"));
	symbol.add(new Node("+"));
	symbol.add(new Node("+"));
	symbol.add(new Node("-"));
	while(symbol.size()>0){//当存储符号的数组队列大于零时,循环继续,注意:符号数要比数字数少一
		Node num1=number.remove(0);//将存放数字的数组队列的第一个数字移除并把它赋值给num1
		Node num2=number.remove(0);/然后再将存放数字的数组队列的第一个数字移除并把它赋值给num2
		Node s=symbol.remove(0);//将存放符号的数组队列的第一个符号移除并把它赋值给s
		s.left=num1;//将结点对象num1赋值给s的左结点
		s.right=num2;//将结点对象num2赋值给s的左结点
		number.add(0,s);//将符号结点s加入存放数字结点的第一位
	}
	root=number.get(0);//将最后一个结点赋值给根节点
	Node n=new Node();//创建一个新的节点对象
	n.frontbianli(root);//调用前序遍历的方法
	n.middlebianli(root);//调用中序遍历的方法
	n.behindbianli(root);//调用后序遍历的方法
}
public static void main(String []args){
	twotree two=new twotree();//创建类的对象
	two.creattree();执行创建二叉树的方法
}
}

 到这里表达式二叉树就结束了,希望可以给大家提供点帮助。

猜你喜欢

转载自blog.csdn.net/coder150806/article/details/82666704
今日推荐