leetcode刷题之旅(145)二叉树的后序遍历
题目描述
给定一个二叉树,返回它的 后序 遍历。
样例
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
思路分析
方法一:递归,按照后序遍历“左右根”的顺序,依次遍历,递归即可
方法二:循环写法,写法类似先序和中序,但添加的list时用了头插,实际遍历顺序为右根左
方法三:利用双栈,一个栈进行右根左的遍历,另一栈保存值,由于是先进后出,出栈顺序就是后序遍历的顺序了
代码及结果
方法一:
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) {
return list;
}
return postorderTraversal(root, list);
}
public List<Integer> postorderTraversal(TreeNode root,ArrayList<Integer> list) {
if (root != null) {
if (root.left != null) {
postorderTraversal(root.left, list);
}
if (root.right != null) {
postorderTraversal(root.right, list);
}
list.add(root.val);
}
return list;
}
方法二:
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode temp = root;
while (!stack.isEmpty() || temp != null) {
while (temp != null) {
stack.push(temp);
list.add(0, temp.val);
temp = temp.right;
}
temp = stack.pop();
temp = temp.left;
}
return list;
}
方法三:
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) {
return list;
}
Stack<TreeNode> stack1 = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
stack1.push(root);
TreeNode temp;
while (!stack1.isEmpty()) {
temp = stack1.pop();
if (temp.left != null) {
stack1.push(temp.left);
}
if (temp.right != null) {
stack1.push(temp.right);
}
stack2.push(temp);
}
while (!stack2.isEmpty()) {
temp = stack2.pop();
list.add(temp.val);
}
return list;
}