import java.util.Stack;
class Node{
String data;
Node lChild;
Node rChild;
public Node(String data){
this.data=data;
this.lChild=null;
this.rChild=null;
}
}
public class Demo {
public static void preOrder(Node p){ //先序遍历
Stack<Node> stack=new Stack<Node>();
while(!stack.isEmpty()||p!=null){
while(p!=null){ //遇到一个节点将其输出,将其右孩子压入栈中
System.out.print(p.data); //然后处理其左孩子,而左孩子本身
stack.push(p.rChild); //又可以看做一个节点
p=p.lChild;
}
if(!stack.isEmpty()){ //输出到叶子节点后,从栈中弹出一节点
p=stack.pop();
}
}
System.out.println("");
}
public static void inOrder(Node p){ //中序遍历
Stack<Node> stack=new Stack<Node>();
while(p!=null||!stack.isEmpty()){
while(p!=null){ //遇到一个节点后,先将其压入栈中
stack.push(p); //然后处理其左孩子
p=p.lChild;
}
if(!stack.isEmpty()){//处理到叶子节点后,从栈中弹出一个节点
p=stack.pop();
System.out.print(p.data);
// if(!stack.isEmpty()){ //这段代码表示在此节点出栈时,将
// p=stack.pop(); //将其父节点也出栈,后来发现此段代码其实
// System.out.print(p.data);//不必书写
// }
p=p.rChild; //处理其右孩子
}
}
System.out.println("");
}
public static void postOrder(Node p){ //后序遍历
Stack<Node> stack=new Stack<Node>();
if(p==null) return;
Node last=p;//记录上一个访问的节点
stack.push(p);
while(!stack.isEmpty()){
p=stack.peek();
// p没有孩子或者p如果有孩子,而且孩子都已经访问过,则访问p节点
if((p.lChild==null&&p.rChild==null)||(p.rChild==null&&last==p.lChild)
||last==p.rChild){
System.out.print(p.data);
last=p;
stack.pop();
}else{//p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
if(p.rChild!=null)
stack.push(p.rChild);
if(p.lChild!=null)
stack.push(p.lChild);
}
}
System.out.println("");
}
public static void main(String[] args) {
Node root=new Node("A");
Node node1=new Node("B");
Node node2=new Node("C");
Node node3=new Node("D");
Node node4=new Node("E");
Node node5=new Node("F");
Node node6=new Node("G");
root.lChild=node1;
root.rChild=node2;
node1.lChild=node3;
node1.rChild=node4;
node2.lChild=node5;
node2.rChild=node6;
preOrder(root);
inOrder(root);
postOrder(root);
}
}
二叉树的非递归遍历
最新推荐文章于 2021-12-09 15:08:47 发布