1 题目
链接:二叉树的后序遍历
给定一个二叉树,返回它的后序遍历(左右根)。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2 Python
2.1 方法一:迭代
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
ans = []
if not root:
return ans
stack = [root]
while stack:
top = stack.pop()
ans += [top.val]
if top.left:
stack += [top.left]
if top.right:
stack += [top.right]
ans.reverse()
return ans
其实是将右左根的前序遍历的结果翻转
2.2 方法二:递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
ans = []
if not root:
return ans
else:
ans += self.postorderTraversal(root.left)
ans += self.postorderTraversal(root.right)
ans += [root.val]
return ans
3 Java
3.1 方法一(递归)
/**
* 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 LinkedList<Integer>();
if(root == null) return list;
list.addAll(postorderTraversal(root.left));
list.addAll(postorderTraversal(root.right));
list.add(root.val);
return list;
}
}
3.2 方法二(栈迭代)
注意压栈顺序!
注意需要判断左右节点是否为null!避免返回null,list.add()报错
/**
* 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 LinkedList<Integer>();
if(root == null) return list;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.empty()){
root = stack.pop();
// 注意需要判断是否为null!
if(root == null) continue;
list.add(root.val);
// 注意顺序!
stack.push(root.left);
stack.push(root.right);
}
Collections.reverse(list);
return list;
}
}