漫长学期的预告

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LeetCode上题目:

https://leetcode.cn/problems/binary-tree-postorder-traversal/

1.前序遍历:节点遍历顺序为 中、左、右。

如图结构二叉树,输出顺序如图中1,2,3所示。

 

 递归是最容易想到的方式。

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> r = new ArrayList<>();
        rs(root,r);
        return r;
    }

    void rs(TreeNode n,List<Integer> r){
        if(n == null) return;
        r.add(n.val);
        if(n.left !=null) rs(n.left,r);
        if(n.right !=null) rs(n.right,r);
    }

但递归深度过深可能出现Stack Overflow,而且反复的进行出栈入栈也影响效率,可以用栈模拟递归。

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> r = new ArrayList<>();
        if(root == null) return r;
        Stack<TreeNode> s = new Stack<>();
        s.push(root);
        while(!s.isEmpty()){
            TreeNode n = s.pop();
            r.add(n.val);
            if(n.right != null) s.push(n.right);
            if(n.left != null) s.push(n.left);
        }
        return r;
    }

两者按照完全相同的顺序访问了二叉树的各个节点,只是一个用的递归,一个用的循环。

 

2.中序遍历 : 如图结构二叉树,输出顺序如图中1,2,3所示。

LeetCode 题目: https://leetcode.cn/problems/binary-tree-inorder-traversal/

递归式:

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> r = new ArrayList<>();
        rs(root,r);
        return r;
    }

    void rs(TreeNode n,List<Integer> r){
        if(n == null) return;
        if(n.left !=null) rs(n.left,r);
        r.add(n.val);
        if(n.right !=null) rs(n.right,r);
    }

 

循环式:

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> r = new ArrayList<>();
    if(null == root) return r;
    Stack<TreeNode> s = new Stack<>();
    TreeNode cur = root;
    while(!s.isEmpty() || cur != null){
        while(cur != null){
            s.push(cur);
            cur = cur.left;
        }
        TreeNode n = s.pop();
        r.add(n.val);
        if(n.right != null)
            cur = n.right;
    }
    return r;
}

 

 

3.后序遍历:  如图结构二叉树,输出顺序如图中1,2,3所示。

 

 LeetCode后序: https://leetcode.cn/problems/binary-tree-postorder-traversal/

 递归式:

    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> r = new ArrayList<>();
        rs(root,r);
        return r;
    }

    void rs(TreeNode n,List<Integer> r){
        if(n == null) return;
        if(n.left !=null) rs(n.left,r);
        if(n.right !=null) rs(n.right,r);
        r.add(n.val);
    }

 

循环式:

    public List<Integer> postorderTraversal(TreeNode root) {
        if(root == null) return new ArrayList<>();
        Stack<TreeNode> s1 = new Stack();
        Stack<TreeNode> s2 = new Stack();
        s1.push(root);
        while(!s1.isEmpty()){
            TreeNode n = s1.pop();
            s2.push(n);
            if(n.left != null)
                s1.push(n.left);
            if(n.right != null)
                s1.push(n.right);
        }
        List<Integer> r = new ArrayList<>();
        while(!s2.isEmpty())
            r.add(s2.pop().val);    
               
        return r;
    }

 

 

 

 

 

 

posted on 2022-07-21 21:44  漫长学期的预告  阅读(70)  评论(0编辑  收藏  举报