迭代先序遍历二叉树
迭代先序遍历二叉树
- 朴素的想法就是,照着递归把栈实现出来
- 都知道递归就是栈,也知道递归形式很简单
dfs() {
cur;
dfs(left);
dfs(right);
}
关键是怎么把递归用到的栈显式写出来
-
能想到一个简单的对应关系, 就是递归的当前轮次,也就对应着迭代的栈顶。
-
那怎么进入下一层,也就是dfs(left); 呢?
-
依据栈顶和当前执行函数的对应关系,可以想到,我们可以将栈顶元素的左节点不断放入栈顶。
-
想到这里可能会觉得很简单,好像也就是这样就行了
-
但是不同于递归的是,自己管理的栈,你不仅要知道怎么进去,还要知道怎么出来
-
一般用到栈最常规的就是这一句
while(!stack.isEmpty()) {
}
对于这个问题目前写到的地方是
while(!stack.isEmpty()) {
//TreeNode root
while(root.left != null) {
stack.push(root.left)
}
}
这样好像就能体现出dfs(left); 了?并不是,入栈只是表示你接下来要进入这些地方,但你还没真的进去。
- 除此之外,还有一个问题是,如果你还是只有那一个while循环,你将无法进行出栈操作,也就是不能真正的模仿出递归。
- 因此,在之前的while之后,也就是在尽可能地寻找left节点之后,要加入另一个出栈的while循环。
while(!st.isEmpty()) {
TreeNode cur = st.peek();
ans.add(cur.val);
while(cur.left != null) {
st.push(cur.left);
ans.add(cur.left.val);
cur = cur.left;
}
while(!st.isEmpty()) {
TreeNode t = st.pop();
if(t.right != null) {
st.push(t.right);
break;
}
}
}
大概就是这样。
Stay hungry