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;} }