Coding interview: 二叉树的遍历(递归和非递归)

二叉树的非递归遍历就是使用数据结构栈来实现的,下面直接给出代码。

前序遍历

//递归
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);
    }

猜你喜欢

转载自blog.csdn.net/zhumingyuan111/article/details/79662732