LeetCode145-二叉樹的後序遍歷
阿新 • • 發佈:2020-11-30
非商業,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