今天开始学Java 二叉树的遍历

import java.util.Stack;
public class Tree {
public class TreeNode{
int val;
TreeNode right;
TreeNode left;
public TreeNode(int val){
this.val = val;
}
}
//递归前序遍历
public void DGpreOder(TreeNode B){
System.out.println(B.val);
DGpreOder(B.left);
DGpreOder(B.right);

}

//非递归前序遍历

public void preOder(TreeNode B){
if(B == null) return;
Stack<TreeNode> s = new Stack<TreeNode>();
while(B !=null || !s.isEmpty()){
while(B != null){
System.out.println(B.val);
s.push(B);
B=B.left;
}
if(!s.isEmpty()){
B= s.pop();
B=B.right;

}
}

}

//递归中序遍历

public void DGmidOrder(TreeNode B){
DGmidOrder(B.left);
System.out.println(B.val);
DGmidOrder(B.right);

}

//非递归中序遍历

public void midOrder(TreeNode B){
if(B == null) return;
Stack<TreeNode> s = new Stack<TreeNode>();
while( B !=null || !s.isEmpty()){
while( B!=null){
s.push(B);
B=B.left;
}
if(!s.isEmpty()){
B=s.pop();
System.out.println(B.val);
B = B.right;
}

}

}

//递归后续

public void DGpostOder(TreeNode B){
DGpostOder(B.left);
DGpostOder(B.right);
System.out.println(B.val);

}

//非递归后序遍历

public void postOrder(TreeNode B){
if(B == null) return;
Stack<TreeNode> s1= new Stack<TreeNode>();
Stack<Integer> s2 = new Stack<Integer>();
Integer i = new Integer(1);
while(B !=null||!s1.isEmpty()){
while(B !=null){
s1.push(B);
s2.push(0);
B = B.left;
}
//这个循坏的目的是对栈s2栈顶为1时对应的栈s1的栈顶元素进行访问
while(!s1.isEmpty() && s2.peek().equals(i)){
System.out.println(B);
s2.pop();
s1.pop();
 
}
//访问左子树到头后,就可以访问其右孩子了
if(!s1.isEmpty()){
s2.pop();
s2.push(i);
B = s1.peek();
B= B.right;

}
}


}
}

猜你喜欢

转载自blog.csdn.net/u014566193/article/details/79566372