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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章