中序遍历是出栈时访问
循环不变量是将左孩子不断进站,右孩子进站
1.将根节点进站
2.寻找左孩子一直进站
3.循环栈顶,直至找个一个右孩子,退栈时访问
4.循环2.3直至栈为空
public List<Integer> inorderTraversal(TreeNode root) {
//使用list来接树
List<Integer> l =new ArrayList<>();
//根为空则直接将l返回
if(root == null)
return l;
Stack<TreeNode> stack = new Stack<>();
TreeNode t = root;
stack.push(root);
while(!stack.isEmpty()){
//将其左孩子一路进入
while(stack.peek().left != null){
t=stack.peek();
stack.push(t.left);
}
//循环栈顶元素有右孩子进入,没有就退栈
while(!stack.isEmpty()&&stack.peek().right == null){
l.add(stack.peek().val);
stack.pop();
}
if(!stack.isEmpty()){
t = stack.peek();
stack.pop();
stack.push(t.right);
l.add(t.val);
}
}
return l;
}