当前位置: 首页 > news >正文

代碼隨想录 day22|day23

二叉树(完)

二叉搜索树的最近公共祖先
题意:找到二叉树的两个节点的祖先节点 。
思路: 二叉树的中序遍历特性: 如果当前遍历的节点的值> 两个指定的节点的值。 那么祖先节点就在当前节点左子树 。 如果当前遍历节点的值< 两个节点的值 则祖先节点在节点右边。 如果都不是那么当前节点是祖先节点。
核心代码

  TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root->val >p->val && root->val > q->val){return   lowestCommonAncestor(root->left, p, q) ;// 利用搜索二叉树的性质:如果节点在左右节点之间,就是公共祖先。}else if(root->val < p->val && root->val < q->val){return lowestCommonAncestor(root->right, p, q);}return root ; }

二叉搜索树中的插入操作

题意: 是把一个值插入到二叉搜索树中;
思路:最简单的办法是将值插入到叶子结点的左边或者右边。 所以递归边界是节点的左右子树都是空,还有节点有左子树的但是右子树为空的情况。还有节点左子树为空,右子树不为空的情况。
思路2: 不改变二叉树的结构直接在叶子节点接住生成的节点。 通过当前root->val > val 就向左遍历。

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root == NULL) {TreeNode* node = new TreeNode(val);return node;}if (root->val > val) root->left = insertIntoBST(root->left, val);if (root->val < val) root->right = insertIntoBST(root->right, val);return root;}
};

删除二叉搜索树中的节点

题意: 在找到相应值之后如果左或者右孩子有一个不空直接删除 ; 然后将其子返回即可。
但是在删除左右孩子都不为空的情况下,就需要将节点的左孩子直接赋给,右子树的最左叶子节点。 然后返回右子树的根节点。 这是根据二叉搜索树的性质来的。
核心代码

 TreeNode* deleteNode(TreeNode* root, int key) {if( root && root->val == key  ){if ( root->left != nullptr && root->right != nullptr) {// 因为左子树的节点都小于根节点的值,右子树的节点都大于根节点的值 // 将右子树的最左叶子节点,的左节点 的左边接上要删除的节点的右子树根节点。 TreeNode* tmp = root->right ;while(tmp->left){tmp = tmp->left ;} tmp->left =  root->left ;return root->right ; }else if(root->left == nullptr && root ->right != nullptr){TreeNode* tmp = root ; // delete tmp ; return root->right ; }else if(root->left != nullptr && root->right == nullptr){TreeNode* tmp = root ; // delete tmp ; return root->left ; }else{return nullptr ; }}if(root && root->val > key) root->left = deleteNode(root->left,key) ;if(root && root->val < key){root->right = deleteNode(root->right , key) ; }return root ; }

修剪二叉搜索树
虽然说着挺难,但是其实就是把删除二叉树的结点应用而已。
如果找到了不在范围的节点删除而已。
至于删除要分有左子节点没有右子节点的,有右子节点没有左子节点的。 和左右子节点都没有的。 另外需要从下往上回溯删除。不然就上一层的递归就接不着
核心代码

TreeNode* trimBST(TreeNode* root, int low, int high){if(root == nullptr){return nullptr ; }if(root && root->left ){root->left = trimBST(root->left , low ,high) ; }if(root && root->right ){root->right = trimBST(root->right , low ,high) ; }if(root->val <  low||root->val >  high) // 从下往上回溯,因为是从下往上处理的。 {cout<<"YEs"<<endl ; if(root->left == nullptr && root->right != nullptr){return root->right ; }else if(root->left != nullptr && root ->right == nullptr){return root->left ; }else if(root->left != nullptr && root->right != nullptr){TreeNode * cur = root->right ; while(cur->left != nullptr){cur = cur->left ; }cur->left = root->left ; return root->right ; }else {return nullptr ; }}return root ; }

将有序数组转换为二叉搜索树
想到二叉树的性质,根节点是中间节点 。之后把序列分为左子树和右子树 跟先前的序列与二叉搜索树的题有点像。
核心代码

/*** 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* sortedArrayToBST(vector<int>& nums){if(nums.size() == 0){return nullptr ; }vector<int> le  , re;int mid = nums.size() /2 ; int t = nums[ mid] ; for(int i = 0 ; i<mid ; ++i ){le.push_back(nums[i]) ; }for(int i = mid+1 ; i <nums.size() ; ++i){re.push_back(nums[i]) ; }TreeNode * root = new TreeNode(t) ; root->left = sortedArrayToBST(le) ; root->right = sortedArrayToBST(re) ; return root ; }
};

把二叉搜索树转换为累加树
题意:使用双指针的算法。不过要改变遍历顺序改为右中左。 之后root-.>val += prev->val ;
核心代码

   void trival(TreeNode * root){if(root == nullptr){return  ; }convertBST(root->right) ;if(pre != nullptr){root->val += pre->val ; }pre  = root ; convertBST(root->left) ; }

相关文章:

  • 7EPhone云手机各功能详解
  • Java 面试题:Java 的动态代理是基于什么原理?
  • js文件 .mjs和.umd.js结尾的文件的区别
  • 【光伏预测】基于BP神经网络实现光伏发电功率预测附Matlab代码
  • Spring Cloud Gateway 集成 Nacos、Knife4j
  • 计算机网络7——网络安全3 互联网使用的安全协议
  • 网关(Gateway)- 自定义过滤器工厂
  • 基于安卓的虫害识别软件设计--(2)模型性能可视化|混淆矩阵、热力图
  • 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
  • x264 参考帧管理原理:b_ref_reorder 数组变量
  • Vue:路由管理vue-router
  • 信息标记形式 (XML, JSON, YAML)
  • DeepFace ——用于高级人脸识别算法探索与应用
  • 【Python】Python异步编程
  • FFmpeg 中 Filters 使用文档介绍
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【知识碎片】第三方登录弹窗效果
  • 11111111
  • AngularJS指令开发(1)——参数详解
  • Apache的80端口被占用以及访问时报错403
  • Cumulo 的 ClojureScript 模块已经成型
  • ECS应用管理最佳实践
  • Java Agent 学习笔记
  • js递归,无限分级树形折叠菜单
  • Mysql优化
  • orm2 中文文档 3.1 模型属性
  • python3 使用 asyncio 代替线程
  • Redis 懒删除(lazy free)简史
  • webpack4 一点通
  • 从零搭建Koa2 Server
  • 看域名解析域名安全对SEO的影响
  • 前端_面试
  • 数据可视化之 Sankey 桑基图的实现
  • 线性表及其算法(java实现)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • # dbt source dbt source freshness命令详解
  • #define用法
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (pojstep1.3.1)1017(构造法模拟)
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (区间dp) (经典例题) 石子合并
  • .NET 8 跨平台高性能边缘采集网关
  • .net 生成二级域名
  • .net8.0与halcon编程环境构建
  • .net的socket示例
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [<事务专题>]