表达式二叉树的定义:
通过自然表达式的优先级顺序,构建出与表达式相应的二叉树模型,这样的二叉树模型就是表达式二叉树。
例如:(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();执行创建二叉树的方法
}
}
到这里表达式二叉树就结束了,希望可以给大家提供点帮助。