http://www.lintcode.com/en/problem/binary-tree-inorder-traversal/
注意点: 看不明白的话,先拿二叉树按代码的逻辑跑一遍。
栈中先放root的左子树,之后清空后放右子树。
非递归:
while(!s.empty() || temp != null) {
while(temp != null) {
s.push(temp);
temp = temp.left; //while循环加下面的这系列操作相当于在result中存放左结点和root
}
temp = s.pop(); //相当于result中存放左结点和root
result.add(temp.val); //相当于result中存放左结点和root
temp = temp.right; //在result中存放右结点
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //分治 2 public ArrayList<Integer> inorderTraversal(TreeNode root) { 3 ArrayList<Integer> result = new ArrayList<Integer>(); 4 if(root == null) return result; 5 6 ArrayList<Integer> left = inorderTraversal(root.left); 7 ArrayList<Integer> right = inorderTraversal(root.right); 8 result.addAll(left); 9 result.add(root.val); 10 result.addAll(right); 11 return result; 12 13 } 14 //非递归 15 public ArrayList<Integer> inorderTraversal(TreeNode root) { 16 Stack<TreeNode> stack = new Stack<TreeNode>(); 17 ArrayList<Integer> result = new ArrayList<Integer>(); 18 if(root == null) return result; 19 TreeNode temp = root; 20 //temp == null 表示此分支为null,不再需要往stack里添加结点,而是直接取出结点 21 while(!stack.empty() || temp != null){ 22 while(temp != null) { 23 stack.push(temp); 24 temp = temp.left; 25 } 26 temp = stack.pop(); 27 result.add(temp.val); 28 //temp != null,则相当于对右子树进行之前root的入栈操作 29 temp = temp.right; 30 } 31 return result; 32 } 33 34 //游走遍历, 要返回的结果一直作为参数在传递 35 public ArrayList<Integer> inorderTraversal(TreeNode root) { 36 ArrayList<Integer> result = new ArrayList<Integer>(); 37 return traverse(root, result); 38 } 39 private ArrayList<Integer> traverse(TreeNode root, ArrayList<Integer> result) { 40 if(root == null) return result; 41 traverse(root.left, result); 42 result.add(root.val); 43 traverse(root.right, result); 44 return result; 45 }