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