LeetCode145-二叉树的后序遍历

 

非商业,LeetCode链接附上:

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

进入正题。

 

题目:

给定一个二叉树,返回它的 后序 遍历。

 

示例:

示例1:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]

 

代码实现:

//节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

//方法一 递归
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {

        List<Integer> res = new ArrayList<>();
        postOrder(root, res);
        return res;
    }

    public void postOrder(TreeNode root, List<Integer> res) {
        
        if(root == null) {
            return;
        }
        postOrder(root.left, res);
        postOrder(root.right, res);
        res.add(root.val);
    }
}
//时间复杂度O(n),空间复杂度O(n)

//方法二 迭代
class Solution {

    public List<Integer> postorderTraversal(TreeNode root) {

        LinkedList<Integer> res = new LinkedList<>();
        Deque<TreeNode> stack = new LinkedList<>();

        if(root == null) {
            return res;
        }

        stack.add(root);
        while (!stack.isEmpty()) {

            TreeNode node = stack.pollLast();
            res.addFirst(node.val);

            if(node.left != null) {
                stack.add(node.left);
            }
            if(node.right != null) {
                stack.add(node.right);
            }
        }
        return res;
    }
}
//时间复杂度O(n),空间复杂度O(n)

 

分析:

二叉树的前序遍历就是按“左-右-中”的顺序遍历所有的节点;

二叉树的遍历,递归需要更抽象的思考,怎样设置结束条件,如何“递”、怎么“归”;

迭代的方法利用链表的pollLast()和addFirst()方法,将后得到的节点添加到更前面。先右子树,后左子树的顺序。

 

--End

 

posted @ 2020-11-30 18:22  黑冰台  阅读(98)  评论(0)    收藏  举报