二叉樹的非遞歸遍歷就是使用數據結構棧來實現的,下面直接給出代碼。
前序遍歷
//遞歸
static void recursionPreIterator(Node root){
if(root == null) {
return;
}
System.out.println(root.v);
recursionPreIterator(root.left);
recursionPreIterator(root.right);
}
//非遞歸
static void nonRecursionPreIterator(Node root){
Node dummy = new Node(0);//這是一個假節點,先放進棧中,後續不進行打印即可。
dummy.right = root;
Stack<Node> stack = new Stack<Node>();
stack.push(dummy);
Node p = null;
while(!stack.empty()){
p = stack.pop().right;
while(p!=null){
stack.push(p);
System.out.println(p.v);
p = p.left;
}
}
}
中序遍歷
//遞歸
static void recursionMidIterator(Node root){
if(root == null) {
return;
}
recursionMidIterator(root.left);
System.out.println(root.v);
recursionMidIterator(root.right);
}
//非遞歸
static void nonRecursionMidIterator(Node root){
Node dummy = new Node(0);
dummy.right = root;
Stack<Node> stack = new Stack<Node>();
stack.push(dummy);
Node p = null;
while(!stack.empty()){
p = stack.pop();
if(p!=dummy){
System.out.println(p.v);
}
p = p.right;
while(p!=null){
stack.push(p);
p = p.left;
}
}
}
後序遍歷
//遞歸
static void recursionPostIterator(Node root){
if(root == null) {
return;
}
recursionPostIterator(root.left);
recursionPostIterator(root.right);
System.out.println(root.v);
}
//非遞歸
static void nonRecursionPostIterator(Node root){
Node dummy = new Node(0);
dummy.right = root;
Stack<Node> stack = new Stack<Node>();
stack.push(dummy);
Node p = null,child = null;
while(!stack.empty()){
p = stack.peek();
if(p.left!=null && child != p.left && child!=p.right){
p = p.left;
while(p!=null){
stack.push(p);
p = p.left;
}
} else if(p.right!=null && child != p.right){
p = p.right;
while(p!=null){
stack.push(p);
p = p.left;
}
}else {
p = stack.pop();
child = p;
if(p != dummy)
System.out.println(p.v);
}
}
}
測試
//構建樹
static Node createTree(int[]array,int i){
if(i>=array.length) return null;
Node node = new Node(array[i]);
node.left = createTree(array,i*2);
node.right = createTree(array,i*2+1);
return node;
}
//主函數
public static void main(String[]args){
int []array = {0,1,2,3,4,5,6,7,8,9};
Node root = createTree(array,1);
recursionPreIterator(root);
nonRecursionPreIterator(root);
nonRecursionMidIterator(root);
nonRecursionPostIterator(root);
}