- 题目链接:145. 二叉树的后序遍历 - 力扣(LeetCode): https://leetcode.cn/problems/binary-tree-postorder-traversal/
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你二叉树的根节点 root ,返回它节点值的 后序 遍历。
树中节点数目在范围 [0, 100] 内-100 <= Node.val <= 100public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
import java.util.ArrayList;
import java.util.List;
public class LeetCode145_01_01 {
public List<Integer> binaryTreeList = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if (root == null) {
return binaryTreeList;
}
// 前序遍历
// binaryTreeList.add(root.val);
postorderTraversal(root.left);
// 中序遍历
// binaryTreeList.add(root.val);
postorderTraversal(root.right);
// 后序遍历
binaryTreeList.add(root.val);
return binaryTreeList;
}
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class LeetCode145_01_02 {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> binaryTreeList = new ArrayList<>();
Stack<TreeNode> treeNodeStack = new Stack<>();
// 当根节点为 null 时,直接返回
if (root == null) return binaryTreeList;
TreeNode cur = root;
// prev 记录上一个弹出的节点
TreeNode prev = null;
// 第一遍把 root 节点放入
do {
if (cur != null) {
treeNodeStack.push(cur);
while (cur.left != null) {
treeNodeStack.push(cur.left);
cur = cur.left;
}
}
cur = treeNodeStack.peek();
// 不存在右孩子或者这个节点的右孩子已经遍历过了
if (cur.right == null || cur.right == prev) {
binaryTreeList.add(cur.val);
// 记录弹出的节点
prev = treeNodeStack.pop();
System.out.println(prev.val);
// cur 定义为 null 可以避免重复进入右孩子
cur = null;
} else {
cur = cur.right;
}
// 因为存在右孩子时,会重新将节点压回栈中
// 栈为空即遍历结束
} while (!treeNodeStack.isEmpty());
return binaryTreeList;
}
}
cur = null; 就是这行代码,让我苦思了两天。。。整体思路是