zoukankan      html  css  js  c++  java
  • 迭代先序遍历二叉树

    迭代先序遍历二叉树

    1. 朴素的想法就是,照着递归把栈实现出来
    2. 都知道递归就是栈,也知道递归形式很简单
    dfs() {
        cur;
        dfs(left);
        dfs(right);
    }
    

    关键是怎么把递归用到的栈显式写出来

    1. 能想到一个简单的对应关系, 就是递归的当前轮次,也就对应着迭代的栈顶。

    2. 那怎么进入下一层,也就是dfs(left); 呢?

    3. 依据栈顶和当前执行函数的对应关系,可以想到,我们可以将栈顶元素的左节点不断放入栈顶。

    4. 想到这里可能会觉得很简单,好像也就是这样就行了

    5. 但是不同于递归的是,自己管理的栈,你不仅要知道怎么进去,还要知道怎么出来

    6. 一般用到栈最常规的就是这一句

    while(!stack.isEmpty()) {
        
    }
    

    对于这个问题目前写到的地方是

    while(!stack.isEmpty()) {
        //TreeNode root
    	while(root.left != null) {
            stack.push(root.left)
        }
    }
    

    这样好像就能体现出dfs(left); 了?并不是,入栈只是表示你接下来要进入这些地方,但你还没真的进去。

    1. 除此之外,还有一个问题是,如果你还是只有那一个while循环,你将无法进行出栈操作,也就是不能真正的模仿出递归。
    2. 因此,在之前的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;
                }
                }
            }
    

    大概就是这样。

  • 相关阅读:
    三、Vue CLI-单页面
    width100%,设置padding或border溢出解决方法
    一、Linux平台部署ASP.NET、ASP.NET CORE、PHP
    二、Core授权-2 之.net core 基于Identity 授权
    一、doT.js使用笔记
    一、域名认证信息
    HB-打包
    一、模型验证CoreWebApi 管道方式(非过滤器处理)2(IApplicationBuilder扩展方法的另一种写法)
    python 写的几道题
    美团面试总结
  • 原文地址:https://www.cnblogs.com/agnes6/p/13754922.html
Copyright © 2011-2022 走看看