二叉树的前中后序遍历的递归与非递归算法模版

1.节点数据结构

public class Node {

    public int value;
    public Node left;
    public Node right;

    public Node(int data){
        this.value = value;
    }
}

2.递归

public class Recur {

    public void preOrderRecur(Node head){
        if (head == null){
            return;
        }

        System.out.println(head.value + " ");
        preOrderRecur(head.left);
        preOrderRecur(head.right);
    }

    public void inOrderRecur(Node head){
        if (head == null){
            return;
        }

        inOrderRecur(head.left);
        System.out.println(head.value + " ");
        inOrderRecur(head.right);
    }

    public void posOrderRecur(Node head){
        if (head == null){
            return;
        }

        posOrderRecur(head.left);
        posOrderRecur(head.right);
        System.out.println(head.value + " ");
    }
}

3.非递归

import java.util.Stack;

public class UnRecur {

    public void preOrderUnRecur(Node head) {
        System.out.println("pre-order: ");
        if (head != null) {
            Stack<Node> stack = new Stack<>();
            stack.add(head);
            while (!stack.isEmpty()) {
                head = stack.pop();
                System.out.println(head.value + " ");
                if (head.right != null) {
                    stack.push(head.right);
                }
                if (head.left != null) {
                    stack.push(head.left);
                }
            }
        }
    }

    public void inOrderUnRecur(Node head) {
        System.out.println("in-order: ");
        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.println(head.value + " ");
                    head = head.right;
                }
            }
        }
    }

    public void posOrderUnRecur(Node head) {
        System.out.println("pos-order: ");
        if (head != null) {
            Stack<Node> stack = new Stack<>();
            stack.push(head);
            Node c;
            while (!stack.isEmpty()) {
                c = stack.peek();
                if (c.left != null && head != c.left && head != c.right) {
                    stack.push(c.left);
                } else if (c.right != null && head != c.right) {
                    stack.push(c.right);
                } else {
                    System.out.println(stack.pop().value + " ");
                    head = c;
                }
            }

        }
    }
}

 4.另一种后续遍历写法

public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();

        TreeNode cur = root;
        TreeNode last = null;
        while(cur != null || !stack.isEmpty()) {
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.peek();
            if (cur.right == null || cur.right == last) { // 右孩子为空或者访问过了
                res.add(cur.val); 
                stack.pop();
                last = cur;
                cur = null; 
            } else {
                cur = cur.right;
            }
        }

        return res;
    }

5.其他后序遍历思路

超简单思路:先NRL存到List中然后逆序一下即可

posted @ 2020-04-22 12:36  All_just_for_fun  阅读(290)  评论(0编辑  收藏  举报