分別用遞歸和非遞歸的方式實現二叉樹先序、中序和後序遍歷

分析:

先序:訪問根節點、先序遍歷左子樹、先序遍歷右子樹

中序:中序遍歷左子樹,訪問根節點,中序遍歷右子樹

後序:後序遍歷左子樹,後序遍歷右子樹,訪問根節點

因此,遞歸實現就很簡單

public class test3 {
    public class Node{
        private int value;
        private Node leftNode;
        private Node rightNode;
        public Node(int value){
            this.value = value;
        }
    }
    //先序遍歷
    public void preOrder(Node root){
        if (root == null)
            return;
        System.out.println(root.value + "訪問根節點");
        preOrder(root.leftNode);
        preOrder(root.rightNode);
    }
    //中序遍歷
    public void innerOrder(Node root){
        if (root == null)
            return;
        innerOrder(root.leftNode);
        System.out.println(root.value + "訪問根節點");
        innerOrder(root.rightNode);
    }
    //後序遍歷
    public void posOrder(Node root){
        if (root == null)
            return;
        posOrder(root.leftNode);
        posOrder(root.rightNode);
        System.out.println(root.value + "訪問根節點");
    }
}
 用遞歸實現的都可以使用棧實現
先看先序遍歷
1、申請一個棧stack,將頭結點壓入stack中
2、從stack中彈出頭結點,記爲cur,打印cur的值,再將cur的右孩子壓入棧中,再將cur的左孩子壓入棧中
3、不斷重複2,直到stack爲空
public void preUncur(Node root){
        if (root != null){
            Stack<Node> stack = new Stack<>();
            stack.add(root);
            while (!stack.isEmpty()){
                root = stack.pop();
                if (root.rightNode != null)
                    stack.add(root.rightNode);
                if (root.leftNode != null)
                    stack.add(root.leftNode);
            }
        }
    }
中序遍歷
1、申請一個棧stack
2、先把頭結點壓入棧中,再把他的左邊界壓入棧中
3、重複2
public void innerUncer(Node root){
        if (root != null){
            Stack<Node> stack = new Stack<>();
            stack.push(root);
            if (!stack.isEmpty() && root != null){
                if (root != null){
                    stack.push(root);
                    root = root.leftNode;
                }else {
                    root = stack.pop();
                    System.out.println(root.value + "");
                    root = root.rightNode;
                }
            }
        }
    }
後序遍歷
1、申請兩個棧,將頭結點壓入棧stack中彈出stack中的頂點壓入stack1中,
2、若頭結點有孩子節點,則壓入stack中,直到無左右孩子,此時
3、彈出stack棧中的頂點壓入stack1中,重複2
 public void posUncer(Node root){
        if (root != null){
            Stack<Node> stack = new Stack<>();
            Stack<Node> stack1 = new Stack<>();
            stack.push(root);
            if (!stack.isEmpty()){
                stack1.push(stack.pop());
                if (root.leftNode != null){
                    stack.push(root.leftNode);
                }
                if (root.rightNode != null)
                    stack.push(root.rightNode);
            }
            while (!stack1.isEmpty()){
                System.out.println(stack1.pop().value + "");
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章