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

代码随想录算法训练营第二十天(二叉树 七)

day19 周日放假 今天依旧是二叉树环节

力扣题部分:

235. 二叉搜索树的最近公共祖先

题目链接:. - 力扣(LeetCode)

题面:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

思路:

        和day18的二叉树公共祖先不同的是,这一次我们可以利用二叉搜索树的特点遍历一个路径就够了,其他的倒没什么太大区别。

具体思路细节内容可以看day18的最后一题 236. 二叉树的最近公共祖先,这里就不重复了。

传送门(day18):代码随想录算法训练营第十八天(二叉树 六)-CSDN博客

代码实现:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(p -> val > q -> val) swap(q, p);if(root -> val >= p -> val && root  -> val <= q -> val) return root;if(root -> val < p -> val && root -> right) return lowestCommonAncestor(root -> right, p, q);if(root -> val > q -> val && root -> left) return lowestCommonAncestor(root -> left, p, q);return nullptr;}
};

701.二叉搜索树中的插入操作

题目链接:. - 力扣(LeetCode)

题面:

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

思路:

        按照最简单的想法,一条路径走到底最后创造一个叶子节点挂树上就好了,可以不重构二叉树就不要重构二叉树了,不然就很麻烦(就像下一道题)。

代码实现:

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

450.删除二叉搜索树中的节点

题目链接:. - 力扣(LeetCode)

题面:

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

思路:

        我们知道插入可以插入在叶子节点也可以不插入在叶子节点,而删除就没得选择,所有情况都要考虑,那就得按需要删除的结点情况分类讨论了:

1.没找到。

        解决办法:遍历到空节点直接返回。

2.找到了,在叶子节点上。

        解决办法:删除节点并返回空节点。

3.找到了,左边有子树右边没有。

        解决办法:像链表一样,要删除的节点的父节点指向要删除节点的左节点,相当于绕过要删除的节点,然后记得删除释放空间。

4.找到了,右边右子树左边没有。

        解决办法:第三条类似,父节点指向删除节点的右节点。

5.找到了,左右两边都有子树。

        解决办法:最难的部分。先讲操作:将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点

我们知道二叉搜索树要保证中序遍历递增,删除节点的左子树全部比右子树小,该节点一删右节点像之前一样一补上去,整个左子树就悬空了,由于左子树都比右子树小,所以只能把悬空的左子树根节点放在右节点最小的节点左侧,这样就可以让中序遍历仍旧是递增的了。(如果还有点懵,可以尝试画个图自己手动删除节点理解一下)

代码实现:

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == nullptr) return root; // 第一种情况if (root->val == key) {// 第二种情况if (root->left == nullptr && root->right == nullptr) {delete root;return nullptr;}// 第三种情况else if (root->left == nullptr) {auto retNode = root->right;delete root;return retNode;}// 第四种情况else if (root->right == nullptr) {auto retNode = root->left;delete root;return retNode;}// 第五种情况else {TreeNode* cur = root->right; // 找右子树最左面的节点while(cur->left != nullptr) {cur = cur->left;}cur->left = root->left;TreeNode* tmp = root;root = root->right;delete tmp;return root;}}if (root->val > key) root->left = deleteNode(root->left, key);if (root->val < key) root->right = deleteNode(root->right, key);return root;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言之“ 数组 ”
  • MySQL存储过程深入指南
  • 三千元左右的卧室投影仪怎么选?当贝D6X Pro代替电视的最佳选择
  • 构建实时数据仓库:流式处理与实时计算技术解析
  • FastHTML:使用 Python 彻底改变 Web 开发
  • Linux 基础命令大全
  • 浮点数的使用
  • 【solidity 学习】错误处理机制汇总
  • 【大数据】Eueka与Nacos对比分析,你该怎么选择?
  • 关于HTTP HEAD介绍
  • linux上用anaconda创建一个新环境,并将nicegui的应用打包为一个可执行应用
  • 应用方案 | 低功耗接地故障控制器D4145
  • Day42 | 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
  • 20240820模拟面试
  • 利用Python实现供应链管理中的线性规划与资源优化——手机生产计划2:利润最大化
  • ----------
  • ES6指北【2】—— 箭头函数
  • Android组件 - 收藏集 - 掘金
  • Angular 2 DI - IoC DI - 1
  • flutter的key在widget list的作用以及必要性
  • HomeBrew常规使用教程
  • Kibana配置logstash,报表一体化
  • laravel5.5 视图共享数据
  • MySQL几个简单SQL的优化
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Promise面试题2实现异步串行执行
  • python学习笔记 - ThreadLocal
  • React+TypeScript入门
  • Spring Boot快速入门(一):Hello Spring Boot
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 阿里研究院入选中国企业智库系统影响力榜
  • 基于组件的设计工作流与界面抽象
  • 思考 CSS 架构
  • 协程
  • 新手搭建网站的主要流程
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • Python 之网络式编程
  • ![CDATA[ ]] 是什么东东
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #define与typedef区别
  • #HarmonyOS:Web组件的使用
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.ajax,axios,fetch三种ajax请求的区别
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (7) cmake 编译C++程序(二)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (javascript)再说document.body.scrollTop的使用问题
  • (分布式缓存)Redis持久化
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十)c52学习之旅-定时器实验
  • (实战篇)如何缓存数据
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)C#调用WebService 基础