题目
Given a binary tree, return the inorder traversal of its nodes' values.
二叉树中序遍历。
1 中序的迭代一定要自己想着写一遍AC才能有感觉。
2 写的根据依然是根据递归。需要一个stack。
a 把所有左边的节点依次入栈。
b 出栈最后一个节点。打印。
c 如果有右节点,继续入栈从a 继续。
d 可是如果没有右节点呢? 从a 继续就会死循环。
e 这时候考虑一个记录点,表示目前这个节点的左节点,都检查过了。
3 所以重头写
a 把所有左边的节点一次入栈。那时候记录点都表示为没检查过。
b 出栈最后一个节点。记录点表示为检查过(没有左节点了)。打印这个节点。
c 如果有右节点,入栈,同时记录点表示为没检查过。
4 其实还有更简单的代码,但是我觉得这个代码思路是最清晰的,所以不准备简化
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> ans = new ArrayList<Integer>();
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
if(root==null){
return ans;
}
TreeNode cur = root;
stack.push(cur);
int sign = 1;
while(!stack.isEmpty()){
while(sign==1&&cur.left!=null){
stack.push(cur.left);
cur =cur.left;
}
cur =stack.pop();
ans.add(cur.val);
sign=0;
if(cur.right!=null){
stack.push(cur.right);
cur = cur.right;
sign=1;
}
}
return ans;
}
}