二叉树的递归遍历非常简单,今天写了非递归遍历的方式
前序遍历和中序遍历类似,唯一的不同是前序遍历立即访问根节点,中序遍历在遍历右子树之前访问根节点
后序遍历用两个栈实现
import java.util.Stack;
public class TraversalBTree {
//前序遍历
public static void preTraver(BTree node) {
BTree tree = node;
Stack<BTree> stack = new Stack<BTree>();
while (tree != null || !stack.isEmpty()) {
while (tree != null) {
System.out.println(tree.value);//输出根节点
stack.push(tree);//根节点入栈
tree = tree.left;//遍历左子树
}
if (!stack.isEmpty()) {
tree = stack.pop();
tree = tree.right;//遍历右子树
}
}
}
//中序遍历
public static void midTraver(BTree node){
BTree tree=node;
Stack<BTree> stack = new Stack<BTree>();
while (tree != null || !stack.isEmpty()) {
while (tree != null) {
stack.push(tree);//根节点入栈
tree = tree.left;//遍历左子树
}
if (!stack.isEmpty()) {
tree = stack.pop();
System.out.println(tree.value);//输出根节点
tree = tree.right;//遍历右子树
}
}
}
//后序遍历,双栈
public static void postTraver(BTree node){
BTree tree=node;
Stack<BTree> stack=new Stack<BTree>();
Stack<BTree> temp=new Stack<BTree>();
while(tree!=null||!stack.isEmpty()){
while(tree!=null){
stack.push(tree);
temp.push(tree);
tree=tree.right;
}
if(!stack.isEmpty()){
tree=stack.pop();
tree=tree.left;
}
}
while(!temp.isEmpty()){
System.out.println(temp.pop().value);//输出结果
}
}
}