二叉树前中后序遍历 迭代法 只需一招!
核心思想
以中序遍历为例
在迭代法中 我们拿到 1 节点 由于有左孩子 我们就会推入 2 节点,2 节点又有左孩子, 所以我们推入 4 然后弹出, 接着弹出 2 节点, 由于这是第二次访问 2 节点, 也就意味着左子树已经去过了, 所以推入 5 节点。
那么我们模拟一下 栈的变化
假设左边为栈顶。
1 -> 21 -> 421-> 21 -> 51 -> 1 -> 3
所以 每当一个节点我们访问到第二次的时候就是输出节点值的时候
那么我们可以每次入栈的时候 标记下节点的访问次数:
"first" -> 第一次
"second" -> 第二次
对于第一次访问的节点 我们依次推入他的 右中左 节点 这样从栈顶往下看 就是 左中右的顺序,也就是中序的顺序。
对于第二次访问的节点 我们记录他的节点值就好
代码
中序遍历
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<Object> stack = new LinkedList<>();
stack.addFirst(root);
stack.addFirst("first");
while(!stack.isEmpty()){
String cnt = (String) stack.pollFirst();
TreeNode cur = (TreeNode) stack.pollFirst();
if(cur == null)
continue;
if(cnt.equals("first")){
stack.addFirst(cur.right);
stack.addFirst("first");
stack.addFirst(cur);
stack.addFirst("second");
stack.addFirst(cur.left);
stack.addFirst("first");
}else{
res.add(cur.val);
}
}
return res;
}
}
前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<Object> stack = new LinkedList<>();
stack.addFirst(root);
stack.addFirst("first");
while(!stack.isEmpty()){
String p = (String) stack.pollFirst();
TreeNode cur = (TreeNode) stack.pollFirst();
if(cur == null)
continue;
if(p.equals("first")){
stack.addFirst(cur.right);
stack.addFirst("first");
stack.addFirst(cur.left);
stack.addFirst("first");
stack.addFirst(cur);
stack.addFirst("second");
}else{
res.add(cur.val);
}
}
return res;
}
}
后序遍历
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<Object> stack = new LinkedList<>();
stack.addFirst(root);
stack.addFirst("first");
while(!stack.isEmpty()){
String cnt = (String) stack.pollFirst();
TreeNode cur = (TreeNode) stack.pollFirst();
if(cur == null)
continue;
if(cnt.equals("first")){
stack.addFirst(cur);
stack.addFirst("second");
stack.addFirst(cur.right);
stack.addFirst("first");
stack.addFirst(cur.left);
stack.addFirst("first");
}else{
res.add(cur.val);
}
}
return res;
}
}
本文作者:ganyq
本文链接:https://www.cnblogs.com/ganyq/p/18168182
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步