Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values.
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [3,2,1]
.
Can you do it without recursion?
SOLUTION 1:
recursion:
分治法解决之,非常直观,非常好理解,左子树加到result里,右子树加入result里,再把root加到result里。
看代码:
public class Solution { /** * @param root: The root of binary tree. * @return: Postorder in ArrayList which contains node values. */ public ArrayList<Integer> postorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); if (root == null){ return result; } ArrayList<Integer> left = postorderTraversal(root.left); ArrayList<Integer> right = postorderTraversal(root.right); result.addAll(left); result.addAll(right); result.add(root.val); return result; } }
SOLUTION 2:
no-recursion:
1
/ \
2 3
/ \
4 5
假设一个树是上面这个样子,开始分析:
1,将根节点入栈,并将根节点的孩子入栈,入栈顺序为:先入右孩子,再入左孩子,顺序不能错。因为这样在弹栈时的顺序就是后序遍历的顺序了。如果左孩子还有左孩子或者右孩子,那么继续按先右后左的顺序入栈。那么上面这棵树开始的入栈顺序是:1,3,2。由于2不存在左右孩子,停止入栈。
2,由于2没有左右孩子,遍历2并将2弹出,同时使用prev记录下2这个节点。
3,2出栈后,栈为{1,3},此时3在栈顶,由于3存在左右孩子,按顺序入栈,此时栈为{1,3,5,4}。
4,将4和5遍历并出栈,此时prev指向5,栈为{1,3}。prev的作用是什么呢?用来判断prev是否为栈顶元素的孩子,如果是,则说明子树的孩子已经遍历完成,需要遍历树根了。以上树为例:4和5出栈后,prev指向5,而5是栈顶元素3的孩子,说明孩子已经遍历完毕,则遍历3然后弹出3即可,即完成了子树{3,4,5}的后序遍历。
5,此时栈为{1},为树根,而左右子树都遍历完了,最后遍历树根并弹出即可。
以上方法取自:大神 http://www.cnblogs.com/zuoyuan/p/3720846.html 讲的非常详细。
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root: The root of binary tree. * @return: Postorder in ArrayList which contains node values. */ public ArrayList<Integer> postorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); if (root == null){ return result; } Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode pre = null; while (root != null || !stack.isEmpty()){ if (root != null){ stack.push(root); root = root.left; } else if (stack.peek().right != pre){ root = stack.peek().right; pre = null; } else { pre = stack.pop(); result.add(pre.val); } } return result; } }