二叉树中的深搜

news2024/9/22 21:12:05

一)计算布尔二叉树的值

2331. 计算布尔二叉树的值 - 力扣(LeetCode)

1)计算布尔二叉树需要从叶子节点向上进行计算,从下向上进行计算

2)完整二叉树是同时拥有左孩子和右孩子,或者是完全没有右孩子

3)当我只是盯着根节点来看的时候,此时我想知道我这一层的结果是什么?必须先知道这个根节点的左子树的布尔值,还需要知道右子树的布尔值,当我知道左右子树是true或者是false的时候,在我这一层把左右子树的信息整合;

4)如果想要知道左子树或者是右子树是true还是false,这不是恰好和我们的大问题是一样的吗?主问题就是解决这棵树是true还是false

5)重复子问题函数头:给定一个指针,判断以这个指针为结点的树是true还是false,求以这个节点为根节点的boolean值

6)函数体:先知道左子树是true还是false,再知道右子树是true还是false最后在本层进行整合

boolean flag1=dfs(root.left);

boolean flag2=dfs(root.right);

return root.val==2?flag1orflag2:flag1&flag2

7)递归出口:遇到叶子节点,只需要将叶子节点是true还是false返回

8)本质上这个题就是在做一个后序遍历,本质上就是一个深度优先遍历,先返回左节点的boolean值,再返回右节点的boolean值,最后再根据根结点的值进行计算,在遇到叶子节点的时候,将叶子节点的信息返回到上一层

 

class Solution {
    public boolean evaluateTree(TreeNode root) {
    if(root==null) return true;
    if(root.left==null&&root.right==null) return root.val==0?false:true;
//先进行计算左子树的boolean值
        boolean flag1=evaluateTree(root.left);
//再进行计算右子树的boolean
        boolean flag2=evaluateTree(root.right);
        return root.val==2?flag1|flag2:flag1&flag2;
    }
}

二)求根节点到叶子节点数字之和

129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

1)二叉树的递归问题想一下递归到某一层的时候要干什么事情,当遍历到某一个根节点所干的事情都一样的时候,况且干这个事情能够得到最终我所想要的结果,那么这个这个事情就是相同子问题,当我们遍历到某一个根节点的时候,还是需要将这个跟跟节点的左子树之和和右子树之和计算相加返回给上一层

2)此时我们需要进行计算的点就是当遍历到某一个根节点的时候,需要知道前面的数字的信息,就比如说遍历到5的时候是需要知道12的信息的,因为当前我遍历到这一层的时候我什么也不知道,我怎么计算出1258呢?我只是知道当前根节点以及后续节点的信息,根本不知道当前根节点以前的信息

3)知道12的信息之后,再结合当前根节点进行计算出125的值,然后再将125传递给它的左子树和右子树,算出左右子树的值,最后将对应的值返回给根节点,在进行相加,返回到上一层节点

第一步:知道前面的数是12之后,进行计算当前结点的值是125 

第二步:将当前的这个125传递给以5为根节点的左子树,算出左子树的和是1258

第三步:将这个125传递给以5为根节点的右子树,计算出右子树的和是XXXX

第四步:将左子树和右子树返回的和进行相加,最后返回当前根节点的上一层

1)函数头的设计:你给我传入一个根节点之后,把以这个根节点相连的左右子树叶子之和进行返回,int dfs(Node root,int k)参数是当前传入的根节点和你传递到这个根节点的时候,从原始根节点到这个递归层次的结点的路径和,传入一个根节点,计算出以当前根节点的所有叶子节点之和进行返回

2)函数体:执行1 2 3 4步

3)递归出口:递归出口是在第二步进行执行的

class Solution {
    public int GetSum(TreeNode root,int k){
        //根据题目给定的数据范围来说不可能出现根节点的情况
        //遍历到叶子结点的时候才到了递归结束的出口
        if(root.left==null&&root.right==null){
            return root.val+k*10;
        }
        int current=k*10+root.val;
        int ret=0;
        //算出左子树的和
        if(root.left!=null) ret+=GetSum(root.left,current);
        //算出右子树的和
        if(root.right!=null) ret+=GetSum(root.right,current);
        //返回值是左子树和右子树的和
        return ret;
    }
    public int sumNumbers(TreeNode root) {
           return GetSum(root,0);
    }
}

三)二叉树剪枝:

814. 二叉树剪枝 - 力扣(LeetCode)

1)在这个问题中子问题就是给定一个头指针,将以这个头指针为根节点的所有为0的子树全部干掉,返回最后处理结果的头指针

2)当给定一个头结点的信息的时候,我必须知道以当前根节点的左子树的信息和以当前根节点的右子树的信息,必须是左子树全为0或者是右子树全为0,我才可以将左子树或者是右子树剪掉,所以需要后序遍历,因为只有出现后序遍历的时候,才能带着左子树的信息和右子树的信息;

3)进行模拟递归的过程:从叶子节点开始判断,通过决策树模拟删除递归的这样一个过程即可

1)当判断完左子树之后,我需要继续进行判断右子树也就是0的右节点,此时发现右节点的左子树和右子树也都是空,况且右节点的值也是0,所以右节点也是可以干掉的,但是此时返回到1的时候虽然发现左节点和右节点都是空,但是发现当前根节点是1,所以不能干掉

2)接下来继续判断0的右节点

3)函数体:先处理左子树,再进行处理右子树,再来处理当前节点

4)函数出口:root=null

class Solution {
    //给定一个根节点,返回左子树和右子树简直之后的头节点
    public TreeNode pruneTree(TreeNode root) {
        if(root==null) return null;
        root.left=pruneTree(root.left);
//返回左子树剪枝之后的结果,将左子树中是0的分支全部干掉,返回处理完成之后的左根节点
        root.right=pruneTree(root.right);
//返回右子树剪枝之后的结果,将右子树是的0的分支全部干掉,返回处理之后的右根节点
        //判断当前位置是否需要剪枝,如果发现左右子树都为空,况且当前节点是0,那么直接返回即可
        if(root.left==null&&root.right==null&&root.val==0){
            return null;
        }else{
            return root;
        }
    }
}

四)验证二叉搜索树

98. 验证二叉搜索树 - 力扣(LeetCode)​​​​​​

之前我的做题思路就是说先进行判断一下以当前节点为根节点的左子节点和右子节点是一颗二叉搜索树,再进行判断当前根节点的左子树是否是一颗二叉搜索树,和当前根节点的右子树是否是一颗二叉搜索树没但是这个判断方法是错误的,只能通过72个测试用例,请看上面

解法1:根据中序遍历的结果来判断这颗树是否是二叉搜索树

class Solution {
    public List<Integer> GetList(TreeNode root){
        Stack<TreeNode> stack=new Stack<>();
        List<Integer> list=new ArrayList<>();
        while(!stack.isEmpty()||root!=null){
            while(root!=null){
                stack.push(root);
                root=root.left;
            }
            TreeNode node=stack.pop();
            list.add(node.val);
            root=node.right;
        }
        return list;
    }
    public boolean isValidBST(TreeNode root) {
        List<Integer> list=GetList(root);
        for(int i=0;i<list.size()-1;i++){
            if(list.get(i)>=list.get(i+1)) return false;
        }
        return true;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/811133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSON Web 令牌 (JWT)攻击

一、什么是JSON Web 令牌 &#xff08;JWT&#xff09; JSON Web令牌&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用间传递声明信息。它是一种轻量级、自包含的安全性传输格式&#xff0c;通常用于在身份验证和授权过程…

三更博客系统(完整笔记+前后台系统代码实现)

三更博客前后端分离系统 前后端分离博客系统1.技术栈2.创建工程3.博客前台3.0 准备工作3.1 SpringBoot和MybatisPuls整合配置测试 3.1 热门文章列表3.1.0 文章表分析3.1.1 需求3.1.2 接口设计3.1.3 基础版本代码实现3.1.4 使用VO优化3.1.5 字面值处理 3.2 Bean拷贝工具类封装3.…

C#百万数据处理

C#百万数据处理 在我们经验的不断增长中不可避免的会遇到一些数据量很大操作也复杂的业务 这种情况我们如何取优化如何去处理呢&#xff1f;一般都要根据业务逻辑和背景去进行合理的改进。 文章目录 C#百万数据处理前言一、项目业务需求和开发背景项目开发背景数据量计算业务需…

OpenFeign原理浅析

OpenFeign原理我个人觉得是非常简单的&#xff0c;如果你对Spring非常了解&#xff0c;知道FactoryBean&#xff0c;以及注入bean的方式&#xff0c;并掌握动态代理&#xff0c;那么自己实现一个类似这样的Http代理客户端是一点问题也没有的&#xff01; 使用流程 首先我们先过…

BLE连接、配对和绑定

参考&#xff1a;一篇文章带你解读蓝牙配对绑定 参考&#xff1a;BLE安全之SM剖析(1) 参考&#xff1a;BLE安全之SM剖析&#xff08;2&#xff09; 参考&#xff1a;BLE安全之SM剖析(3) 参考&#xff1a;https://blog.csdn.net/chengbaojin/article/details/103691046 参考&…

【MQTT5】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…

Flowable-服务-骆驼任务

目录 定义图形标记XML内容Flowable与Camel集成使用示例设计Came路由代码 定义 Camel 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Camel 任务是作为一种特殊的服务 任务来实现的。主要做路由工作的。 图形标记 由于 Camel 任务不是 BPMN 2.…

BMI指数计算小工具Java

现在越来越多的人关注健康&#xff0c;关注身材管理&#xff0c;不妨做个小工具&#xff0c;计算自己的BMI&#xff0c;给自己制定合理的健身或减肥计划&#xff0c;享受健康生活&#xff01;&#xff01;&#xff01;BMI的计算标准从网上找的&#xff0c;不知道是否准确&#…

❤ yarn 和npm 的使用

❤ yarn 和npm 的使用 yarn 版本1的使用 yarn 简介 Yarn是facebook发布的一款取代npm的包管理工具。 yarn特点&#xff1a; 1&#xff0c;速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因…

TransGPT 开源交通大模型开源

TransGPT 是开源交通大模型&#xff0c;主要致力于在真实交通行业中发挥实际价值。 它能够实现交通情况预测、智能咨询助手、公共交通服务、交通规划设计、交通安全教育、协助管理、交通事故报告和分析、自动驾驶辅助系统等功能。 TransGPT 作为一个通用常识交通大模型&#…

cmd相关操作命令

1.根据端口号查询对应进程的PID netstat -ano | findstr 端口号 例如&#xff1a;netstat -ano | findstr 9080&#xff1b;该端口所属进程的PID为6684 2.根据PID查询对应进程 tasklist | findstr PID 例如&#xff1a;tasklist | findstr 6684&#xff1b;该PID所属进程名为…

啥都收费,不仅智能电视没人买了,连电视盒子也卖不出了

分析机构给出的数据指今年上半年国内的电视盒子销量跌破百万至92.9万台&#xff0c;同比下滑29%&#xff0c;享受额更是大跌32%&#xff0c;显示出电视盒子即使大幅降价也没人买了&#xff0c;导致消费者远离电视在于收费太离谱了。 一、啥都收费 如今的智能电视其实并不智能&a…

使用贝叶斯滤波器通过运动模型和嘈杂的墙壁传感器定位机器人研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Day48 算法记录|动态规划15 (子序列)

子序列 392. 判断子序列115.不同的子序列 392. 判断子序列 这道题和1143最长公共字串相同 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。 class Solution {public boolean isSubsequence(String s,…

【C语言初阶篇】自定义类型结构体我不允许还有人不会!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1 . 什么是结构体1.1 结构的定义1.2 结构的声明 2.结构体初始化2.1 用标签名定义和初始化2.2…

【Vue】Vue-Cli整合Echart

Vue-Cli整合Echart 文章目录 Vue-Cli整合Echart一、创建Vue-Cli项目1、创建并运行Vue Cli hello-world项目2、运行vue-element-admin项目 二、Vue-Cli整合Echart1、使用echarts CDN源实现K线图绘制2、使用VueCli echarts实现K线图绘制3、echart更多使用问题整理 一、创建Vue-C…

LeetCode222. 完全二叉树的节点个数

222. 完全二叉树的节点个数 文章目录 [222. 完全二叉树的节点个数](https://leetcode.cn/problems/count-complete-tree-nodes/)一、题目二、题解方法一&#xff1a;递归遍历所有结点方法二&#xff1a;根据完全二叉树的特性递归方法三&#xff1a;迭代 一、题目 给你一棵 完全…

[C语言] 数组

1. 一维数组的创建和初始化 2. 一维数组的使用 3. 一维数组在内存中的存储 4. 二维数组的创建和初始化 5. 二维数组的使用 6. 二维数组在内存中的存储 7. 数组越界 8. 数组作为函数参数 9. 数组的应用实例 1 &#xff1a;三子棋 10. 数组的应用实例 2 &#…

初阶数据结构——二叉树题目

文章目录 一、单值二叉树二、检查两颗树是否相同三、另一棵树的子树四、二叉树的前序遍历五、对称二叉树 一、单值二叉树 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff…

AD原理图检查ERC(编译检查)

原理图的编译&#xff1a; 原理图界面选择菜单栏的&#xff1a;工程---->Compile PCB Project 也可以项目管理栏右击对应项目文件 在右下角&#xff0c;点击panels---->Message&#xff0c;就可以打开Message界面 原理图的常用检测&#xff1a; 原理图界面选择菜单…