二叉树的深搜_求根节点到叶节点数字之和_验证二叉搜索树_二叉树的所有路径

2331. 计算布尔二叉树的值

二叉树遍历可以用递归来解决,该问题的简单子问题是 知道左右孩子的值,再根据| &返回true/false。左子树右子树的值交给dfs解决。

终止条件就是到达叶子节点,即没有左右孩子,因为是完全二叉树 所以只需要判断一个孩子是否存在就可以。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        if(root->left==nullptr)//因为完全二叉树判断一个就可以
            return root->val;
        bool left=evaluateTree(root->left);
        bool right=evaluateTree(root->right);
        if(root->val==2) return (left||right);
        else return (left&&right);
    }
};

129. 求根节点到叶节点数字之和

数字总和=每一条路径累加的数字

怎么算路径上累加的数字呢?
拿图中的5举例,遍历完左孩子8就应该返回1258,5和8是知道的,但12呢?这就需要我们传递参数。所以函数头不仅需要当前节点的指针,还要有累加的数字12.

每遍历一个节点就累加当前节点的val,如果为叶子节点就直接返回,有孩子继续递归累加数字。

所以简单的子问题就是从根节点开始累加val,并传给左右叶子节点,累加数字并返回。

左右孩子还有孩子就交给dfs完成,直到叶子节点返回。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode* root) {
        return dfs(root,0);
    }
    int dfs(TreeNode*root,int presum)
    {
        presum=presum*10+root->val;
        if(root->left==nullptr&&root->right==nullptr)
            return presum;
        int sum=0;
        if(root->left) sum+=dfs(root->left,presum);
        if(root->right) sum+=dfs(root->right,presum);
        return sum;
    }
};

814. 二叉树剪枝

什么时候可以处理root为当前节点的子树呢?当然是后序遍历完它的左右子树,获取左右子树的情况才能进行处理。

什么情况下可以删除它呢?左右子树+当前节点val==0时吗?可以,但不是最简单的情况。

我们后序遍历最先删除的肯定是为0的叶子结点,只要判断当前节点没有左右孩子+当前节点val==0就可以删除以当前节点为根的子树。

像上述左右子树+当前节点val==0,3个节点val都为0,根据上面的判断从叶子节点开始删也可以一个一个删除。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        if(root==nullptr)return nullptr;
        root->left=pruneTree(root->left);
        root->right=pruneTree(root->right);
        if(root->left==nullptr&&root->right==nullptr&&root->val==0)
        {
            //delete root;
            root=nullptr;
        }
        return root;
    }
};

98. 验证二叉搜索树

我们知道搜索二叉树的中序遍历是有序的。我们定义一个全局的变量prve记录上一个遍历数的大小,进行中序遍历,如果prve不是单调变化的,就说明它不是二叉搜索树。

判断左子树 判断当前节点 判断右子树

剪枝:

1.判断完左子树如果返回的false,就可以直接返回false

2.判断当前节点也是,是fasle就直接返回,不是就更新prve

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    long prve=LONG_MIN;
public:
    bool isValidBST(TreeNode* root) {
        if(root==nullptr) return true;
        bool left=true,right=true;
        if(root->left) left=isValidBST(root->left);
        //剪枝
        if(left==false) return false;
        if(prve<root->val) prve=root->val;
        else return false;
        if(root->right) right=isValidBST(root->right);
        return left&&right;
    }
};

细节:因为节点最小值为INT_MIN,所以prve类型为logn 定义为LONG_MIN

230. 二叉搜索树中第 K 小的元素

和上道题一样,通过中序排序就可以找第k小的数。

建议定义两个全局变量,kq判断是否到第K个数,re记录要返回的值。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    int re=-1;
    int kq;
public:
    int kthSmallest(TreeNode* root, int k) {
        kq=k;
        dfs(root);
        return re;
    }
    void dfs(TreeNode* root)
    {
        if(root==nullptr||kq==0) return;
        dfs(root->left);
        if(--kq==0)
        {
            re=root->val;
            return;
        }
        dfs(root->right);
        return;
    }
};

257. 二叉树的所有路径

 深度遍历二叉树时,用一个path字符串来记录经过的结点:不是叶子节点加val->,叶子节点加val,并返回。返回到哪里?可以定义一个全局的string数组,记录每条路径。

path字符串可以定义成全局的吗?

我们知道当访问到4叶子节点时,就要回溯到2,此时path:1->2->4变成1->2

如果定义成全局变量每次回溯都要进行手动恢复path。

因此我们可以把path当作参数传给递归函数,每个函数栈中都会保存一份path,当递归返回到上一层时,上一层的 path 会自动恢复成调用该递归的状态,无需额外处理。

从根节点开始进行深度优先遍历。
在遍历的过程中,维护一个当前路径列表,用来存储从根节点到当前节点的路径。
当遍历到一个叶子节点时,将当前路径添加到结果列表中。
遍历过程中,递归地处理左右子树,返回到父节点时,撤销之前的选择。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    vector<string> re;
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        string path="";
        dfs(root,path);
        return re;
    }
    void dfs(TreeNode*root,string path)
    {
        if(root==nullptr) return;
        if(root->left||root->right)
            path+=to_string(root->val)+"->";
        else
        {
            path+=to_string(root->val);
            re.push_back(path);
        }
        dfs(root->left,path);
        dfs(root->right,path);
            
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter占用内存高问题排查解决

前言 前段时间我们上线了实例内存预警功能&#xff0c;方便大家更好地管理服务器内存资源。那么&#xff0c;也有同学会问&#xff0c;如果收到系统通知&#xff0c;我该怎么做呢&#xff1f;系统提示交换内存占用过高&#xff0c;但是又不知道是哪些程序占用的&#xff0c;怎么…

python下载,安装,环境配置

下载地址&#xff1a;Python Windows版本下载| Python中文网 官网 选择路径 安装完成 检测安装是否成功 使用 winr 启动运行对话框&#xff0c;输入 cmd 进入命令行。 输入pip list 输入 where python 查看 python.exe 的路径 环境配置 winr 打开运行对话框&#xff0c;输入 …

抓取手机HCI日志

荣耀手机 1、打开开发者模式 2、开启HCI、ADB调试 3、开启AP LOG 拨号界面输入*##2846579##* 4、蓝牙配对 5、抓取log adb pull /data/log/bt ./

IDEA 搭建 SpringBoot 项目之配置 Maven

目录 1?配置 Maven 1.1?打开 settings.xml 文件1.2?配置本地仓库路径1.3?配置中央仓库路径1.4?配置 JDK 版本1.5?重新下载项目依赖 2?配置 idea 2.1?在启动页打开设置2.2?配置 Java Compiler2.3?配置 File Encodings2.4?配置 Maven2.5?配置 Auto Import2.6?配置 C…

算法比赛汇总

数据科学竞赛平台网站整理 | ✨DEEPAI数据分析

深入研究物理光学传播和 ZBF 文件

物理光学传播特征 Zemax 中的物理光学传播 (POP) 是一种用于模拟和分析光在光学系统中传播时的行为的工具。与假设理想化几何射线的射线追踪不同&#xff0c;POP 考虑了光的波动性质&#xff0c;包括衍射和干涉。这使得它对于设计和分析显微镜、激光器等高精度光学系统以及其他…

【Java数据结构】栈和队列

栈&#xff08;Stack&#xff09; 栈的概念 栈是一种特殊的线性表&#xff0c;只允许在一端进行插入和删除。栈遵循后进先出&#xff0c;分别在栈顶删除、栈底插入。 栈的常用方法 栈的一些方法&#xff0c;例如&#xff1a;出栈、入栈、取栈顶元素、是否为空、栈中元素个数等…

StarRocks元数据无法合并

一、先说结论 如果您的StarRocks版本在3.1.4及以下&#xff0c;并且使用了metadata_journal_skip_bad_journal_ids来跳过某个异常的journal&#xff0c;结果之后就出现了FE的元数据无法进行Checkpoint的现象&#xff0c;那么选择升级版本到3.1.4以上&#xff0c;就可以解决。 …

使用qrcode.vue生成当前网页的二维码(H5)

使用npm&#xff1a; npm install qrcode.vue 使用yarn&#xff1a; yarn add qrcode.vue package.json&#xff1a; 实现&#xff1a; <template><div class"code"><qrcode-vue :value"currentUrl" :size"size" render-as&…

【STM32】RTT-Studio中HAL库开发教程十:EC800M-4G模块使用

文章目录 一、简介二、模块测试三、OneNet物联网配置四、完整代码五、测试验证 一、简介 EC800M4G是一款4G模块&#xff0c;本次实验主要是进行互联网的测试&#xff0c;模块测试&#xff0c;以及如何配置ONENET设备的相关参数&#xff0c;以及使用STM32F4来测试模块的数据上报…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

【知识】cuda检测GPU是否支持P2P通信及一些注意事项

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 代码流程 先检查所有GPU之间是否支持P2P通信&#xff1b;然后尝试启用GPU之间的P2P通信&#xff1b;再次检查所有GPU之间是否支持P2P通信。 test.cu&…

Mysql大数据量表分页查询性能优化

一、模拟场景 1、产品表t_product,数据量500万+ 2、未做任何优化前,cout查询时间大约4秒;LIMIT offset, count 时,offset 值较大时查询时间越久。 count查询 SELECT COUNT(*) AS total FROM t_product WHERE deleted = 0 AND tenant_id = 1 分页查询 SELECT * FROM t_…

go语言的成神之路-筑基篇-对文件的操作

目录 一、对文件的读写 Reader?接口 ?Writer接口 copy接口 bufio的使用 ioutil库? 二、cat命令 三、包 1. 包的声明 2. 导入包 3. 包的可见性 4. 包的初始化 5. 标准库包 6. 第三方包 ?7. 包的组织 8. 包的别名 9. 包的路径 10. 包的版本管理 四、go mo…

Qt 应用程序转换为服务

一、在 Windows 上将 Qt 应用程序转换为服务 方法1&#xff1a; 创建一个 Windows 服务应用程序&#xff1a; Windows 服务应用程序是一个没有用户界面的后台进程&#xff0c;通常由 Win32 Service 模板创建&#xff0c;或者直接编写 main() 函数以实现服务逻辑。 修改 Qt 应…

【HarmonyOS之旅】HarmonyOS概述(一)

目录 1 -> HarmonyOS简介 2 -> HarmonyOS发展历程 3 -> HarmonyOS技术特性 3.1 -> 硬件互助&#xff0c;资源共享 3.1.1 -> 分布式软总线 3.1.2 -> 分布式设备虚拟化 3.1.3 -> 分布式数据管理 3.1.4 -> 分布式任务调度 3.1.5 -> 分布式连接…

5、栈应用-表达式求值

本章内容使用上述栈结构函数&#xff0c;来完成表达式求值操作。 表达式例如&#xff1a;3*(7-2) 或者 (0-12)*((5-3)*32)/(22) 。 1、实现思路 a、建立OPTR&#xff08;运算符&#xff09;和OPND&#xff08;数字&#xff09;两个栈&#xff0c;后输入字符串以结束 b、自左向…

【软件】教务系统成绩提交工具使用步骤

【软件】教务系统成绩提交工具使用步骤 零、快速开始 安装 与大多数软件一样&#xff0c;安装步骤很简单&#xff0c;一直点击“下一步”即可快速完成安装&#xff0c;安装完成后&#xff0c;在桌面会有一个软件图标&#xff0c;双击即可打开软件主界面。 导入成绩到Excel中…

书签管理工具的使用技巧

分类与筛选技巧 多层级分类&#xff1a;创建多层级的文件夹结构&#xff0c;如先按大的主题分类&#xff0c;再在每个主题下细分小类。例如&#xff0c;先创建 “工作”“学习”“生活” 等大文件夹&#xff0c;在 “工作” 文件夹下再细分 “项目文档”“办公软件”“行业资讯…

如何安全获取股票实时数据API并在服务器运行?

以下是安全获取股票实时数据 API 并在服务器运行的方法&#xff1a; 选择合适的券商或交易平台 评估自身需求&#xff1a;明确自己的交易策略、交易品种、交易频率等需求&#xff0c;以及对 股票api 的功能、性能、稳定性等方面的要求。调研券商或平台&#xff1a;了解不同券商…