递归——二叉树中的深搜

news/2024/10/18 14:06:40/

文章目录

  • 计算布尔二叉树的值
  • 求根节点到叶节点数字之和
  • 二叉树剪枝
  • 验证二叉搜索树
  • 二叉搜索树中第 K 小的元素
  • 二叉树的所有路径

二叉树中的深搜有三种方法

  • 前序遍历
    根->左子树->右子树

  • 中序遍历
    左子树->根->右子树

  • 前序遍历
    左子树->右子树->根

计算布尔二叉树的值

题目:计算布尔二叉树的值

在这里插入图片描述

思路

  • 如果当前节点node 为叶子节点,那么节点的值为它本身
  • 如果当前节点 node 含有孩子节点,对其孩子节点进行递归,计算出其左右孩子节点的值为;
    • 如果node == 2,返回两孩子节点的|运算结果;如果node == 3,返回两孩子节点的&运算结果;

因为是完全二叉树:每个节点有 0 个或者2 个孩子的二叉树。
所以对于递归出口,我们仅需判断当前节点的左孩子是否为空,如果为空,则当前节点为叶子节点;

C++代码

/*** 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;} if (root->val == 2) return evaluateTree(root->left) || evaluateTree(root->right);elsereturn evaluateTree(root->left) && evaluateTree(root->right);}
};

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

题目:求根节点到叶节点数字之和

在这里插入图片描述

思路

  • 从根节点开始,遍历每个节点,如果遇到叶子节点,则将叶子节点对应的数字加到数字之和。如果当前节点不是叶子节点,则计算其子节点对应的数字,然后对子节点递归遍历。

在这里插入图片描述

C++代码

/*** 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 dfs(TreeNode *root, int preSum){preSum = preSum * 10 + root->val;if(root->left == nullptr && root->right == nullptr)return preSum;int res = 0;if(root->left) res += dfs(root->left, preSum);if(root->right) res += dfs(root->right, preSum);return res; }int sumNumbers(TreeNode* root) {return dfs(root, 0);}
};

二叉树剪枝

题目:二叉树剪枝

在这里插入图片描述
思路

返回移除了所有不包含 1的子树的原二叉树。
意思即,删除所有子树没有1的节点
我们要根据其左右子树的状态来判断当前节点能否删除,所有我们使用后序遍历

C++代码

/*** 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){return nullptr;}root->left = pruneTree(root->left);root->right = pruneTree(root->right);if(!root->left && !root->right && root->val == 0){delete root;root = nullptr;}return root;}
};

验证二叉搜索树

题目:验证二叉搜索树

在这里插入图片描述
思路

二叉搜索树:左子树小于根节点;右子树大于根节点
我们知道,二叉搜索树的中序遍历结果是一个有序的数组,所以我们会有这样一个想法:对其进行中序遍历,并将每一个结果的值保存在一个数组中,最后判断该数组是否有序;

使用一个全局变量存储上一个用于对比的数值

C++代码

/*** 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 prev = LONG_MIN;
public:bool isValidBST(TreeNode* root) {if(!root) return true;if(!isValidBST(root->left)) return false;if (prev != LONG_MIN && (root->val <= prev)) return false;prev = root->val;return isValidBST(root->right);}
};

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

题目:二叉搜索树中第 K 小的元素

在这里插入图片描述

思路

两个全局变量 + 中序遍历

  • 一个来标记,次数count
  • 一个来标记,结果ret

C++代码

/*** 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 count, ret;void dfs(TreeNode* root){if(!root || !count) return ;dfs(root->left);if(!(--count)) ret = root->val;dfs(root->right);}
public:int kthSmallest(TreeNode* root, int k) {count = k;dfs(root);return ret;}   
};

二叉树的所有路径

二叉树的所有路径

题目:二叉树的所有路径

在这里插入图片描述
思路

  • dfs函数中,首先将当前节点的值转换为字符串并添加到 path中。
  • 检查当前节点是否为叶子节点(即没有左子节点和右子节点)。如果是叶子节点,将 path 添加到结果数组 res 中,并返回。
  • 如果当前节点不是叶子节点,则继续递归搜索其左子节点和右子节点。
  • 递归调用dfs时,对于非叶子节点,需要在path 后添加 ->符号

C++代码

/*** 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 
{void dfs(TreeNode* root, string path, vector<string>& res){   path += to_string(root->val);if(root->left == nullptr && root->right == nullptr) // 叶子节点不添加 "->"{res.push_back(path);return;}if(root->left) dfs(root->left, path + "->", res);if(root->right) dfs(root->right, path + "->", res);return;   }public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> res;string path;dfs(root, path, res);return res;}
};

http://www.ppmy.cn/news/1540016.html

相关文章

【人工智能】大模型的崛起为AI Agent注入了“聪明的大脑”,彻底改变了定义!

在人工智能的迅猛发展中&#xff0c;大模型的崛起为AI Agent注入了“聪明的大脑”&#xff0c;彻底改变了其定义。如今&#xff0c;基于大模型的AI Agent架构已成为企业应用大模型的首选方案。本文将深入探讨AI Agent的构建、框架选择及其在实际应用中的重要性&#xff0c;帮助…

PCL 点云配准-4PCS算法(粗配准)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 加载点云数据 2.1.2 执行4PCS粗配准 2.1.3 可视化源点云、目标点云和配准结果 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 PCL点云算法汇总及实战案例汇总的目录地址链接…

前端开发学习(一)VUE框架概述

一、MVC模式与MVVM模式 1.1mvc模式 MVC模式是移动端应用广泛的软件架构之一&#xff0c;MVC模式将应用程序划分为3部分:Model(数据模型)、View(用户界面视图)和Controller(控制器)。MVC模式的执行过程是将View层展示给用户&#xff0c;也就是通过 HTML页面接受用户动作&#…

SaaS 为小型企业带来的十大优势

软件即服务&#xff08;SaaS&#xff09;已被各种规模的企业所采用。最近&#xff0c;我们可以清楚地看到 SaaS 为小企业带来的显著好处。如果没有 SaaS&#xff0c;中小企业将无法在竞争中生存。 但在云计算中&#xff0c;SaaS 究竟是什么呢&#xff1f;为什么小企业应该关注…

影视制作中心15个工作站同时用Adobe Premiere处理25个4K视频流

对于4K非编人员来说&#xff0c;高分辨率视频编辑卡顿令人抓狂。但素材越来越多&#xff0c;项目越来越大&#xff0c;如何避免卡顿问题&#xff1f; 要知道影视制作过程中对后端存储的性能与容量有较高要求。我们测试在4K非编环境里&#xff0c;10-15台工作站同时运行Adobe P…

基于单片机的一种蜂鸣器的简易控制

有源和无源这里的“源”不是指电源&#xff0c;而是指震荡源。也就是说&#xff0c;有源蜂鸣器内部带震荡源&#xff0c;所以只要一通电就会叫。而无源内部不带震荡源&#xff0c;所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。有源蜂鸣器往往比无源的贵&#x…

在Linux操作系统上安装NVM教程——CentOS 7/VMware 17版

目录 一、测试网络是否能上网 二、下载阿里云镜像 三、解决执行yum命令出现报错&#xff08;没有就跳过&#xff09; 四、下载NVM安装包 五、解压NVM安装包 六、安装Node 七、连接新的动态库 八、升级GLIBC版本 九、安装GCC 十、查看当前服务器CentOS版本 一、测试网…

qiankun 应用之间数据传递

qiankun 应用之间数据传递 全局共享 initGlobalState qiankun initGlobalState API 单击前往 qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信&#xff0c;该实例有三个方法&#xff0c;分别是onGlobalStateChange、setGlobalState、of…