题解
递归法
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
inorder(root, res);
return res;
}
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
}
迭代法
走到最左下角之前一直入栈,之后一直弹出,转到右节点,并存值
题解参考王尼玛
题解转载自gre-z
1.创建一个Stack,然后按 左 中 右的顺序输出节点。
2.尽可能的将这个节点的左子树压入Stack,此时栈顶的元素是最左侧的元素,其目的是找到一个最小单位的子树(也就是最左侧的一个节点),并且在寻找的过程中记录了来源,才能返回上层,同时在返回上层的时候已经处理完毕左子树了。
3.当处理完最小单位的子树时,返回到上层处理了中间节点。(如果把整个左中右的4.遍历都理解成子树的话,就是处理完 左子树->中间(就是一个节点)->右子树)
如果有右节点,其也要进行中序遍历。
//1.尽可能的将当前节点的左子树压入栈
//2.走到最左下角后出栈,把节点加入list
//3.转到当前节点的右子树(如果有),尽可能的将当前节点的左子树压入栈,循环
//循环终止:没有节点了
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
TreeNode node = root;
//什么时候循环可以终止?没有节点了,即node为null且栈为空
while(stack.size()>0||node!=null){
while(node!=null){
stack.push(node);
node=node.left;
}
TreeNode tmp = stack.pop();
list.add(tmp.val);
if(tmp.right!=null){
//这一步是为了下一次循环开始从这个节点开始循环入栈
node=tmp.right;
}
}
return list;
}
}