Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
使用一个 Stack 进行辅助,优先将 left 节点推入 Stack 中,在循环的最后将 temp 表示成右子树节点
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root==null) return ans;
Stack<TreeNode> stack = new Stack<>();
TreeNode temp = root;
while(!stack.isEmpty() || temp!=null){
while(temp!=null){
stack.push(temp);
temp = temp.left;
}
temp = stack.pop();
ans.add(temp.val);
temp = temp.right;
}
return ans;
}
}
前序的方法改一下add的位置即可,后序的要麻烦一点,用一个指针保存前一个节点,当前节点左右子节点为空或者前一个访问的节点是其子节点则输出
参考http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html,
http://blog.csdn.net/cxllyg/article/details/7520037
以及看到一种时间复杂度O(n),空间复杂度O(1)的Morris Traversal方法
http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
TreeNode cur=root, pre=null;
while(cur!=null){
if(cur.left==null){
ans.add(cur.val);
cur = cur.right;
}else{//寻找前驱节点-左子树的最右节点
pre = cur.left;
while(pre.right!=null && pre.right!=cur)
pre = pre.right;
if(pre.right==null){
pre.right = cur;
cur = cur.left;
}else{
pre.right = null;
ans.add(cur.val);
cur = cur.right;
}
}
}
return ans;
}
}