• 迭代先序遍历二叉树


    迭代先序遍历二叉树

    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;
                }
                }
            }
    

    大概就是这样。

  • 相关阅读:
    Openjudge 1.3 算数表达式与顺序执行
    Openjudge 1.2 变量定义、赋值并转换
    Openjudge 1.4 逻辑表达式与条件分支
    Openjudge 1.5 循环控制
    Openjudge 1.6 一位数组
    Openjudge 1.8 多维数组
    poj-3134 ida*||记录路径bfs
    wust-1588 日期模拟题
    wust 1599弗洛伊德
    hdu5667 费马小定理加矩阵快速幂
  • 原文地址:https://www.cnblogs.com/agnes6/p/13754922.html
Copyright © 2020-2023  润新知