给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
思路1:递归
- 遍历左子树;
- 遍历右子树;
- 访问根节点;
- ArrayList中addAll(指针);
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if (root == null) {
return result;
}
result.addAll(postorderTraversal(root.left));
result.addAll(postorderTraversal(root.right));
result.add(root.val);
return result;
}
}
思路2:
- 利用栈实现;
- 遇到结点P入栈;
- 若P为叶结点或存在左孩子或者右孩子,出栈,将P标记为上一个处理的结点,再将栈顶元素设为当前结点;
- 不满足3中的条件时,将P的右孩子左孩子依次入栈,当前结点置为栈顶元素;
- 栈空,结束;
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root != null) {
Stack<TreeNode> stack = new Stack<>();
TreeNode before = null;
TreeNode now;
stack.push(root);
while (!stack.isEmpty()) {
now = stack.peek();
if ((now.left == null && now.right == null)
|| (before != null && (now.right == before || now.left == before))) {
now = stack.pop();
list.add(now.val);
before = now;
} else {
if (now.right != null) {
stack.push(now.right);
}
if (now.left != null) {
stack.push(now.left);
}
}
}
}
return list;
}
}
思路3:
从根节点开始依次迭代,弹出栈顶元素输出到输出列表中,然后依次压入它的所有孩子节点,按照从上到下、从左至右的顺序依次压入栈中。
因为深度优先搜索后序遍历的顺序是从下到上、从左至右,所以需要将输出列表逆序输出。
代码:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) {
return output;
}
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pollLast();
output.addFirst(node.val);
if (node.left != null) {
stack.add(node.left);
}
if (node.right != null) {
stack.add(node.right);
}
}
return output;
}
}