二叉树三种遍历方式:
前序遍历;
中序遍历;
后序遍历;
对于这三种遍历方式,我通过下面这张图来详细的介绍一下我的方法。
前序遍历:访问根节点->遍历左子树->遍历右子树
中序遍历:遍历左子树->访问根节点->遍历右子树
后序遍历:遍历左子树->遍历右子树->访问根节点
对于上图中的二叉树,分别使用三种遍历得到的结果分别是:
前序遍历:
A
->C
->D
->G
->H
->S
中序遍历:
D
->C
->G
->A
->H
->S
后序遍历:
D
->G
->C
->S
->H
->A
表达式树二叉树应用的一个例子,表达式树的树叶都是操作数,其他节点都是操作符。
后缀表达式转换表达式树算法描述:酷似后缀表达式算法。
如果符号是操作数,构建单个节点并将其入栈,如果是操作符,从栈中弹出两颗树T1和T2(T2先弹出)并形成一个新的树,新树的树根是操作符,左右儿子分别是T1,T2,然后将新树入栈。
import java.util.*;
public class Tree1 {
public static void postToBinary(String str){
Stack<BinaryNode> stack = new Stack<BinaryNode>();
for(int i = 0; i<str.length(); i++){
char ch = str.charAt(i);
switch(ch){
case '*':
case '/':
case '+':
case '-':
BinaryNode rightNode = stack.pop();
BinaryNode leftNode = stack.pop();
BinaryNode newNode = createBinaryNode(ch);
newNode.right = rightNode;
newNode.left = leftNode;//区分左右孩子的位置
stack.push(newNode);
break;
default:
BinaryNode node = createBinaryNode(ch);
stack.push(node);
break;
}
}
printStack(stack.pop());
}
private static BinaryNode createBinaryNode(char ch){
BinaryNode node = new BinaryNode();
node.elem = ch;
node.left = null;
node.right = null;
return node;
}
private static void printStack(BinaryNode node){
if(node!=null){
System.out.print(node.elem);
printStack(node.left);
printStack(node.right);
}
}
public static void main(String[] args) {
String str = "ab+cde+**";
postToBinary(str);
}
}
//二叉树节点类
class BinaryNode{
Object elem; //元素数据
BinaryNode left; //左孩子
BinaryNode right; //右孩子
}