Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> ret = new ArrayList<Integer>();
if(root == null){
return ret;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while(true){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
if(stack.isEmpty()){
break;
}
cur = stack.pop();
ret.add(cur.val);
cur = cur.right;
}
return ret;
}
}
</pre><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">public class Solution{ </span><pre name="code" class="java">public ArrayList<Integer> inorderTraversal(TreeNode root) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<Integer> res = new ArrayList<Integer>();
if(root==null) return res;
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode cur = root;
while(!s.isEmpty()||cur!=null){
if(cur!=null){
s.push(cur);
cur=cur.left;
}else{
cur=s.pop();
res.add(cur.val);
cur=cur.right;
}
}
return res;
}
}
Solution 2: Morris algorithm. Time: O(nlogn) but space O(1).
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<Integer> res = new ArrayList<Integer>();
TreeNode cur=root,next=null;
while(cur!=null){
if(cur.left!=null){
next=cur;
cur=cur.left;
TreeNode temp=cur;
while(temp.right!=null && temp.right!=next){
temp=temp.right;
}
if(temp.right==null){
temp.right=next;
}else{
temp.right=null;
res.add(next.val);
cur=next.right;
}
}else{
res.add(cur.val);
cur=cur.right;
}
}
return res;
}
}