1. 程式人生 > >[算法]死磕二叉樹專題算法

[算法]死磕二叉樹專題算法

AC stack empty out pre else 二叉 後序遍歷 兩個

1. 二叉樹遍歷(遞歸和非遞歸)

構造二叉樹:

class Node{
    public String value;
    public Node left;
    public Node right;
    public Node(String value) {
        this.value = value;
    }
}

遞歸版前序遍歷:

public static void preOrder(Node head){
        if(head != null){
            System.out.print(head.value 
+ " "); preOrder(head.left); preOrder(head.right); } }

遞歸版中序遍歷:

public static void inOrder(Node head){
        if(head != null){
            inOrder(head.left);
            System.out.print(head.value + " ");
            inOrder(head.right);
        }
    }

遞歸版後序遍歷:

    public static void posOrder(Node head){
        if(head != null){
            posOrder(head.left);
            posOrder(head.right);
            System.out.print(head.value + " ");
        }
    }

非遞歸版前序遍歷:

public static void preOrder(Node head){
        if(head != null
){ Stack<Node> stack = new Stack<>(); stack.push(head); while(!stack.isEmpty()){ Node pop = stack.pop(); System.out.print(pop.value + " "); if(pop.right != null) stack.push(pop.right); if(pop.left != null) stack.push(pop.left); } } }

非遞歸版中序遍歷:

    public static void inOrder(Node head){
        if(head != null){
            Stack<Node> stack = new Stack<>();
            while(!stack.isEmpty() || head != null){
                if(head != null){
                    stack.push(head);
                    head = head.left;
                }else{
                    head = stack.pop();
                    System.out.print(head.value + " ");
                    head = head.right;
                }
            }
        }
    }

非遞歸版後序遍歷:

    public static void postOrder(Node head){
        if(head != null){
            Stack<Node> stack1 = new Stack<>();
            Stack<Node> stack2 = new Stack<>();
            stack1.push(head);
            while(!stack1.isEmpty()){
                Node pop = stack1.pop();
                stack2.push(pop);
                if(pop.left != null){
                    stack1.push(pop.left);
                }
                if(pop.right != null){
                    stack1.push(pop.right);
                }
            }
            while(!stack2.isEmpty()){
                System.out.print(stack2.pop().value + " ");
            }
        }
    }

這裏用了兩個棧,其實一個棧也能實現,這裏這樣做是因為可以和前序遍歷對比著記,比較容易。

[算法]死磕二叉樹專題算法