后序遍历
给定一个二叉树的根节点 root ,返回它的 后序 遍历。
后序遍历:按照访问右子树——左子树——根节点的方式遍历这棵树
示例
![[二叉树] 系列:非递归后序遍历 - 图1](/uploads/projects/xinmengwuhen-ga5rv@rbpxet/c18d540a4c8d55ad9aa41c6efc231ed6.jpeg)
方法一:递归
class Solution {List<Integer> res = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {if(root == null) return res;postorderTraversal(root.left);postorderTraversal(root.right);res.add(root.val);return res;}}
方法二:迭代
1.初始化返回列表,判空,初始化栈,初始化prev,cur两个节点
2.循环:当前节点不空或者栈不空
- 从当前节点开始一直往左分别入栈
- 出栈,判断
1.当前节点右孩子为空或者右孩子是前驱节点(父节点出栈之后右孩子不空但是都已经添加到结果列表),将节点值添加到返回列表,更新prev为当前节点,cur为空。
2.当前节点右孩子不为空:当前节点再次入栈,当前节点指向右孩子。
3.返回res
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null) return res;LinkedList<TreeNode> stack = new LinkedList<>();TreeNode cur = root;TreeNode prev = null;while(cur != null || !stack.isEmpty()){while(cur != null){stack.addFirst(cur);cur = cur.left;}cur = stack.removeFirst();if(cur.right == null || cur.right == prev){res.add(cur.val);prev = cur;cur = null;}else{stack.addFirst(cur);cur = cur.right;}}return res;}}
方法三:Morris中序遍历
能将非递归的中序遍历空间复杂度降为 O(1)。
