二叉树的非递归遍历就是使用数据结构栈来实现的,下面直接给出代码。
前序遍历
//递归
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);
}