首页 > 其他分享 >Day 13 二叉树part01

Day 13 二叉树part01

时间:2024-07-15 23:41:11浏览次数:18  
标签:13 遍历 cur part01 res 节点 二叉树 null stack

Day 13 二叉树part01

二叉树的递归遍历

这个用递归就好,现在写起来基本没问题

二叉树的迭代遍历

这个是重点,今天写的时候居然一次写出来了,多刷还是有用的。前中后三种遍历方式,其迭代版本的难度排序 前 < 中 < 后。所以写的时候也是按这个顺序去做的。

144. 二叉树的前序遍历

使用一个栈来存储需要遍历的节点,注意,当遍历一个节点后,我们需要先将其右节点压栈再压栈左节点,这样可以保证先遍历左子树再右子树。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            res.add(tmp.val);
            if(tmp.right != null) stack.push(tmp.right);
            if(tmp.left != null) stack.push(tmp.left);
        }
        return res;
    }
}

94. 二叉树的中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){   //cur代表要遍历的节点
            while(cur != null){  //一直向左走,一直到null
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();  //此时从栈中弹出的节点一定是最左的,因此可以遍历它了
            res.add(cur.val);
            cur = cur.right;  //当该节点遍历完,就应该去遍历其右子树
        }
        return res;
    }
}

145. 二叉树的后序遍历

与中序遍历非常相似,一定要比较着学。

与中序的不同之处在于:

  • 中序遍历中,从栈中弹出的节点,其左子树是访问完了,可以直接访问该节点,然后接下来访问右子树。
  • 后序遍历中,从栈中弹出的节点,我们只能确定其左子树肯定访问完了,但是无法确定右子树是否访问过。

因此,我们在后序遍历中,引入了一个pre来记录历史访问记录。

  • 当访问完一棵子树的时候,我们用pre指向该节点。
  • 这样,在回溯到父节点的时候,我们可以依据pre是指向左子节点,还是右子节点,来判断父节点的访问情况。

while(!stack.isEmpty() || cur != null)对于中序遍历和后序遍历判断条件的理解:

  • 对于左子树访问和右子树访问是不同的,当访问一个节点的时候,我们会从该节点开始,压栈并一直向左走,直到没有左子树才去弹栈,然后转向去访问右子树
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root, pre = null;
        while(cur != null || !stack.isEmpty()){
            while(cur != null){ //和中序遍历完全一致,走到最左即可
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            if(cur.right == null || cur.right == pre) { 
                //如果一个节点没有右子树,或者右子树已经遍历过,那么这个节点就可以被访问了
                res.add(cur.val);
                pre = cur;
                cur = null;
            }else{ //右子树还没遍历,先将cur还原回栈中,转而遍历右子树
                stack.push(cur);
                cur = cur.right;
            }
            
        }
        return res;
    }
}

标签:13,遍历,cur,part01,res,节点,二叉树,null,stack
From: https://www.cnblogs.com/12sleep/p/18304248

相关文章

  • 新手打 XSS-level(1-13) 靶场心得和总结
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言二、解题思路第一关:无过虑机制第二关:闭合标签第三关:单引号闭合+添加事件第四关:双引号闭合+添加事件第五关:不同标签的尝试(新建标签)第六关:大小写绕过第七关:直接将script关键字过滤掉(双写绕过)第......
  • 代码随想录算法训练营第十三天 | 144.二叉树的前序遍历、94、二叉树的中序遍历、145、
    144.二叉树的前序遍历题目:.-力扣(LeetCode)思路:有递归法和使用栈来模拟递归的迭代法。代码:1.递归/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nu......
  • Day11(二叉树) | 二叉树的递归遍历 二叉树的迭代遍历 二叉树的统一迭代法 二
    二叉树的递归遍历终于来到了递归!!!递归是进入动态规划的第一步,有部分的递归完全可以写成动态规划!这里可以移步到左程云的视频观看.递归的步骤:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返......
  • 矩阵优化 DP 以及全局平衡二叉树实现的动态 DP 学习笔记
    矩阵乘法求斐波那契数列的第\(n\)项,其中\(n\le10^{18}\),对数\(m\)取模。写出转移方程,\(f_i=f_{i-1}+f_{i-2}\),直接算是\(O(n)\)的,似乎没什么办法优化。定义大小分别为\(n\timesp\)和\(p\timesm\)的矩阵(分别为\(a\)和\(b\))相乘的结果(矩阵\(c\))是一个大小为\(......
  • 数据结构-二叉树
    引入图论中的树和现实生活中的树长得一样,只不过我们习惯于处理问题的时候把树根放到上方来考虑。这种数据结构看起来像是一个倒挂的树,因此得名。定义一个没有固定根结点的树称为无根树(unrootedtree)。无根树有几种等价的形式化定义:有n个结点,n-1条边的连通无向图无向无环......
  • (138)SRAM接口--->(001)基于FPGA实现SRAM接口
    1目录(a)FPGA简介(b)IC简介(c)Verilog简介(d)基于FPGA实现SRAM接口(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电......
  • (137)SRAM接口--->(004)基于FPGA实现SRAM接口
    1目录(a)FPGA简介(b)IC简介(c)Verilog简介(d)基于FPGA实现SRAM接口(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电......
  • 「代码随想录算法训练营」第十一天 | 二叉树 part1
    二叉树的基本知识链接:https://programmercarl.com/二叉树理论基础.html要点:深度优先遍历前序遍历(递归法,迭代法)中序遍历(递归法,迭代法)后序遍历(递归法,迭代法)广度优先遍历层次遍历(迭代法)由于栈就是递归的一种实现结构,因此前中后序遍历的逻辑可以借助栈使用递归的方式......
  • P3304 [SDOI2013] 直径
    原题链接题解先随便找一条直径,然后标记这些边,然后看看直径上的点有没有不需要经过标记边的路径,使得其长度等于该点到直径端点的路径长度code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;structedge{llto,val;};vector<edge>G[200005];l......
  • 代码随想录算法训练营第22天 |二叉树part07:235. 二叉搜索树的最近公共祖先、701.二叉
    代码随想录算法训练营第22天|二叉树part07:235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点235.二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/代码随想录:htt......