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

day22_236二叉树最近公共祖先_235二叉搜索树(最近公共祖先_701插入一个节点_450删除一个节点)

文章目录

      • [236 二叉树的最近公共祖先](https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%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#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE)
      • [235 二叉搜索树的最近公共祖先](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)
      • [701 二叉搜索树插入一个节点](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)
      • [450 删除二叉树搜素树中的节点](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)

236 二叉树的最近公共祖先

  1. 跨越节点的寻找p和q
if(left && right) return root; //只是对一个节点的判断,还需要其他的节点
else if(!left && right) return right;
else if(left && !right) return left;//超过了一个的节点的返回值
else return NULL;

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

  1. 由于二叉搜索树的性质,如果当前节点在p和q的中间,说明当前节点是最近祖先,再往左子树会错过q,再往右子树会错过p。

701 二叉搜索树插入一个节点

  1. 插入的节点肯定在叶子;
  2. 找插入的位置,递归结束的条件root==NULL,找到插入位置,创建一个新的节点,返回节点。
  3. 递归函数有没有返回值是很重要的,在这里使用的有返回值,返回树的节点。很重要的是在二叉搜索树中如果当前节点的值大于插入节点的值,插入位置就在当前节点的左子树;反之,在右子树。
//遇到空指针,找到插入位置,插入指针,返回指针
if(root == NULL){TreeNode* tmp = new TreeNode(val);return tmp;
}
//决定单层递归逻辑中的赋值操作
if(root->val > val) root->left = insertInToBst(root->left, val);
if(root->val < val) root->right = insertInToBst(root->right, val);

450 删除二叉树搜素树中的节点

  1. 在分析的时候有链表删除的训练想到要找到前驱,但是二叉树的节点有两个孩子,决定前驱找不到,在代码中解决这个问题是通过返回删除以后更新的节点,虽然前驱不好找,但是后继,即删除以后节点的后继是好找的,决定代码的这个逻辑。
//遇到叶子也没有找到删除节点,返回空
if(root == NULL) root NULL;
//找到删除节点,返回删除以后的值
if(root->val == key){return 删除root后的位置
}
//没找到删除节点,当前节点的数大于key,删除节点在当前节点的左子树,在左子树删除节点,更新左子树的值
if(root->val > key) root->left = delete(root->left, key);
//没找到删除节点,当前节点的数小于key,删除节点在当前节点的右子树,在右子树删除节点,更新右子树的值
if(root->val < key) root->right = delete(root->right, key);
return root;
  1. 删除的情况
  • 没有删除节点,返回当前节点;
  • 删除节点是叶子,直接删除;
  • 删除节点是分支节点,左子树为空,右子树不为空,右子树代替当前节点;
  • 删除节点是分支节点,左子树不为空,右子树为空,左子树代替当前节点;
  • 删除节点是分支节点,左右子树均不为空,左右子树均为二叉搜索树,找到右子树最小的节点,在该节点的左孩子插入右子树,左子树的根节点代替删除节点。
//1
if(root == NULL) return root;
if(root->val == val){//2if(root -> left == NULL && root->right == NULL ){delete root;return NULL;}//3else if(root->left == NULL && root -> rigt){TreeNode* tmp = root->right;delete root;return tmp;}//4else if(root->left && root->right == NULL){TreeNode* tmp = root->left;delete root;return tmp;}//5else{TreeNode* lefN = root->left;TreeNode* righN = root->right;while(righN->left) righN = righN->left;righN->left = lefN;righN = root->right;delete root;return righN;}
}
http://www.lryc.cn/news/284315.html

相关文章:

  • OpenSource - 工具管理器easy-manager-tool
  • Laravel7 + easyWeChat 实现微信公众号支付功能
  • Linux环境下,针对QT软件工程搭建C++Test单元测试环境的操作指南
  • 16k+ start 一个开源的的监控系统部署教程
  • Mermaid使用教程(绘制各种图)
  • OpenAI/ChatGPT Plus 支持的虚拟卡有哪些
  • ARM多核调度器DSU
  • vue解决部署文件缓存方式
  • 游戏开发中的噪声算法
  • CodeReview 小工具
  • UE5 C++ Slate独立程序的打包方法
  • 探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式
  • Facebook广告投放指南,如何运营多个Facebook广告账户不被封?
  • 音乐人声分离工具:极简的人声和背景音乐分离工具
  • Go语言基础快速上手
  • Excel 根据日期按月汇总公式
  • 使用 crypto-js 进行 AES 加解密操作
  • Vue-30、Vue非单文件组件。
  • 7-6 实验2_1_判断两数的大小
  • POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场
  • 【STM32】STM32学习笔记-I2C通信外设(34)
  • 从数据角度分析年龄与NBA球员赛场表现的关系【数据分析项目分享】
  • 深入浅出Spring AOP
  • 火速收藏!2024 新年微信红包封面领取全攻略
  • 【RabbitMQ】RabbitMQ安装与使用详解以及Spring集成
  • 企业多云组网怎么办?
  • 背包问题(贪心) 二维01背包问题 Java
  • 2019年认证杯SPSSPRO杯数学建模D题(第二阶段)5G时代引发的道路规划革命全过程文档及程序
  • 可视化k8s页面(Kubepi)
  • 1434. 数池塘(四方向)-深度优先搜索-DFS