day22二叉树part08 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

ops/2024/9/25 8:53:14/

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

这里利用上了二叉搜索树的特性,从上到下遍历,最近的公共祖先一定是满足p->val <= root->val <= q->val的

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {// 确定终止条件,其实这个都可以不写,因为题目说了,一定存在if (root == nullptr) return nullptr;int maxval = max(q->val, p->val);int minval = min(q->val, p->val);if (root->val > maxval) {return lowestCommonAncestor(root->left, p, q);} else if (root->val < minval) {return lowestCommonAncestor(root->right, p, q);} else if (root->val >= minval && root->val <= maxval) {return root;}return nullptr;}
};

相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。
题目链接/文章讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html
视频讲解:https://www.bilibili.com/video/BV1Zt4y1F7ww

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

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {// 确定终止条件// 找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。if (root == nullptr) {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;}
};

本题比想象中的简单,大家可以先自己想一想应该怎么做,然后看视频讲解,就发现 本题为什么比较简单了。
题目链接/文章讲解:https://programmercarl.com/0701.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C.html
视频讲解:https://www.bilibili.com/video/BV1Et4y1c78Y

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

这题逻辑有点复杂,后面二刷的时候要注意多手动模拟模拟

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {// 第一种情况,没找到删除的节点,遍历到空节点直接退出if (root == nullptr) return root;if (root->val == key) {// 第二种情况,左右孩子都为空(叶子节点)。直接删除节点,返回NULL为根节点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;}// 把要删除的节点(root)左子树放在cur的左孩子的位置cur->left = root->left;// 把root节点保存一下,然后删除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;}
};

相对于 插入操作,本题就有难度了,涉及到改树的结构
题目链接/文章讲解:https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html
视频讲解:https://www.bilibili.com/video/BV1tP41177us


http://www.ppmy.cn/ops/44755.html

相关文章

CSS:浮动

▐ 文档流&#xff1a; 由于网页默认是一个二维平面&#xff0c;当我们在网页中一行行摆放标签时&#xff0c;块标签会独占一行&#xff0c;行标签则只占自身大小&#xff0c;这种情况下要实现网页布局就很麻烦了&#xff0c;所以我们就需要通过一些方法来改变这种默认的布局方…

牛客NC236 最大差值【simple 动态规划 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204 思路 不难看出该题可以使用动态规划的方式解题。 在循环数组的过程中&#xff0c;记录截止到当前位置-1的最小值&#xff0c; 然后用当前的值去计算最大的差值。Java代码 im…

贝叶斯算法:机器学习中的“黄金法则”与性能提升之道

&#x1f440;传送门&#x1f440; &#x1f50d;机器学习概述&#x1f340;贝叶斯算法原理&#x1f680;贝叶斯算法的应用✨文本分类✨医疗系统 &#x1f496;贝叶斯算法优化✨贝叶斯算法优化的主要步骤✨贝叶斯算法优化的优点✨贝叶斯算法优化的局限性 &#x1f697;贝叶斯算…

理解OAuth:服务间的授权机制

理解OAuth:服务间的授权机制 好的,让我来教你一下关于这个奇怪的东西。 在不同的项目中,认证有很多不同的方式。但在我们深入探讨它的使用方式之前,让我们先来看看它最初的用途。 首先,我们可以从名称中得到一些线索。“auth”这个词与什么有关呢?问题是,这里的“aut…

生意人【着眼于未来、公私分明、有决断又有人情味、立场、享受过程】

宁可给钱给别人看病&#xff0c;也不收原材料做到公私分明。 老板最怕干部越权&#xff0c;你要先跟老板商量&#xff0c;老板有一个最后点头权 例如&#xff1a;这件事情先谈到这里&#xff0c;我回去请示一下老板&#xff0c;如果他答应&#xff0c;我立刻给你回复。 人只要…

ctfshow web入门 嵌入式 bash cpp pwn

kali转bash shell方法 方便我们本地 bash脚本教程 下面这个代码是bash脚本 #!/bin/bashOIFS"$IFS"IFS"," //表示逗号为字段分隔符set $QUERY_STRING //将参数传入数组Args($QUERY_STRING)IFS"$OIFS" //恢复原始IFS值if [ "$…

React 其他 Hooks

其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext &#xff08;先回顾一下之前的 Context 知识&#xff0c;借用之前 ppt 和源码&#xff09; Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…

设计模式详解(六):适配器模式——Adapter

目录导航 适配器模式及其作用现实生活举例 适配器模式的好处适配器模式的实现关系图实现步骤 适配器模式的适用场景适配器模式示例 适配器模式及其作用 适配器模式是一种结构型设计模式。所谓结构型是指在代码结构方面的设计模式。适配器模式作为中间层&#xff0c;可以让交互…