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

代码随想录算法训练营Day-20 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

经过Day18的递归悟道之后,看递归的题都十分清晰了。

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

1.递归函数作用:传入二叉搜索树根节点和p、q节点,返回遇到的第一个值在p、q值中间的节点,对于二叉搜索树,该节点就是p、q共同祖先

2.终止条件:遇到空节点返回空(其实不写都行,题目不会出现空节点且不会出现不合法情况,所以一定在遍历到空节点之前就找到了)

3.递归逻辑:如果当前根节点值大于pq两值,往左遍历,小于就往右遍历。

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

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

1.递归函数作用:对于非空节点,把值节点插入后,返回根节点;对于空节点,创建值节点并返回

2.终止条件:遇到空节点就创建值节点并返回值节点(返回后会有上一层节点的左右子树接收)

3.递归逻辑:如果当前根节点值大于值说明插入位置在左边,所以把左子树的返回结果放到左子树位置,即更新左子树为插入新节点后的左子树;当前根节点值小于值的情况同理。

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; } };

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

分析:

删除有以下几种情况:

1.当前根节点不是要删的节点;

2.当前根节点是要删的节点,且左为空右为空;

3.当前根节点是要删的节点,且左不为空右为空;

4.当前根节点是要删的节点,且左为空右不为空;

5.当前根节点是要删的节点,且左右都不为空。

递归写法:

1.递归函数作用:树中有key节点,删除key节点,并返回新的根节点;树中没有key节点,不执行删除操作,依旧返回原根节点

2.终止条件:针对五种情况,各自都算终止条件,每个情况执行对应的处理

3.递归逻辑:如果当前值大于key,说明节点在左子树上,所以对左子树执行递归调用,更新到左子树位置;如果当前值小于key的话同理。

class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { //终止条件:包含五种情况处理逻辑 if(root == NULL) return NULL; if(root->val == key){ if(root->left==NULL && root->right==NULL){ delete root; return NULL; } else if(root->left!=NULL && root->right==NULL){ auto reNode = root->left; delete root; return reNode; } else if(root->left==NULL && root->right!=NULL){ auto reNode = root->right; delete root; return reNode; } else{//先找到右子树最左边的元素,把左子树放到该元素的左边,再返回右子树节点 TreeNode* cur = root->right; while(cur->left!=NULL) cur = cur->left; cur->left = root->left; auto reNode = root->right; delete root; return reNode; } } if(root->val > key) root->left = deleteNode(root->left,key); if(root->val < key) root->right = deleteNode(root->right,key); return root; } };

http://www.jsqmd.com/news/610306/

相关文章:

  • AVR平台DataFlash驱动库技术解析与实战应用
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---HITL(Human In The Loop)眯
  • 前端使用AI试水报告读
  • 卡码网C++基础课 | 开房门
  • 基于Java与SSM框架的医院信息管理系统设计与实践
  • STM32驱动自动初始化:initcall机制实践
  • Python主流框架全解析
  • 从零掌握CAPL:信号、系统变量与环境变量的实战应用指南
  • 嵌入式并发控制:RTOS中的竞态条件与解决方案
  • FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香!核
  • 微信聊天记录数据保全指南:本地备份与隐私保护全攻略
  • 2026乐山老兵麻辣烫地址解析:乐山特色麻辣烫哪家好/乐山特色麻辣烫推荐/乐山特色麻辣烫电话/乐山美食店推荐/选择指南 - 优质品牌商家
  • 告别U盘和光盘!用iVentoy把你的旧笔记本变成万能PXE装机服务器
  • SecGPT-14B长文本优化:让OpenClaw处理50页安全报告不超时
  • 工业模拟量传感器抗干扰设计与实践
  • 2026年成都学校四害消杀机构名录:从资质到售后的客观对比 - 优质品牌商家
  • 多旋翼飞行器设计与控制——实战学习应用
  • 基于标注平台数据的 Unity UI 自动化构建工作流设计与工程实践
  • 告别Docker!用nerdctl+buildkit+containerd三件套打造高效镜像构建流水线
  • 2026高速公路划线技术全解析:工艺、标准与主流服务商参考 - 优质品牌商家
  • 00华夏之光永存:(目录)带领华为盘古大模型走向世界巅峰
  • 提升用户体验:用AOS.js为Vue3应用添加优雅的滚动动画效果
  • Leetcode只二叉树中序遍历(python解法)
  • FastAPI子应用挂载:别再让root_path坑你一夜张
  • OpenClaw飞书机器人配置:SecGPT-14B安全警报实时推送
  • 别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅尘
  • Windows10专业版U盘启动盘制作全攻略(附官方工具下载链接)
  • 投机解码(Speculative Decoding) KV Cache
  • FlashAttention 全系列深度解析--IO 感知注意力计算如何重塑 LLM 训练与推理
  • 不满意Oh My Zsh启动卡顿,来试试Starship吧城