题目:
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [3,2,1]
.
二叉树后序遍历:
方法一:递归
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<Integer>();
result = help(root,result);
return result;
}
List<Integer> help(TreeNode root,List<Integer> result)
{
if(root!=null)
{
result = help(root.left,result);
result = help(root.right,result);
result.add(root.val);
}
return result;
}
方法二:栈
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<Integer>();
Stack<TreeNode> stack1 = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
TreeNode temp = new TreeNode(0);
stack1.push(root);
while(!stack1.isEmpty())
{
temp = stack1.pop();
stack2.push(temp);
if(temp.left != null)stack1.push(temp.left);
if(temp.right != null)stack2.push(temp.right);
}
while(!stack2.isEmpty())
{
result.add(stack2.pop().val);
}
return result;
}
方法三:Morris遍历法
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<Integer>();
TreeNode temp=new TreeNode(0),cur;
cur = root;
while(cur != null)
{
if(cur.left == null)
{
cur =cur.right;
}
temp=cur.left;
while(temp != null || temp!=cur)
{
temp=temp.right;
}
if(temp ==null)
{
temp.right = cur;
cur =cur.left;
}
else
{
//反序遍历 cur.left --> temp
temp.right=null;
cur=cur.right;
}
}
return result;
}
参考文献:http://www.linuxidc.com/Linux/2015-08/122480.htm
http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html