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

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':#左右中,使用后序遍历#终止条件if root is None:return root#如果根节点的值为q或者p,那么返回节点if root == q or root == p:return root#单层逻辑#左右中#需要有返回值,因为需要传递节点left = self.lowestCommonAncestor(root.left,p,q)right = self.lowestCommonAncestor(root.right,p,q)if left is None and right is None:  return Noneif left is None and right is not None:return rightelif left is not None and right is None:return leftelse:return root 

三天后写出来了,说明ac了呜呜呜

相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。

使用二叉树的特性,不需要全部都遍历,根节点的数值永远都比左子树的大,永远都比右子树的小

迭代法:

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':#迭代法while root:if root.val > p.val and root.val > q.val:root = root.leftelif root.val < p.val and root.val < q.val:root = root.rightelse:return root 

递归法:

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':def traversal(root,p,q):#递归法#终止条件if root is None:return root#单层逻辑#左边if root.val > p.val and root.val >q.val:left = traversal(root.left,p,q)if left is not None:return left  #右边if root.val < p.val and root.val <q.val:right = traversal(root.right,p,q)if right is not None:return rightreturn rootreturn traversal(root,p,q)

二刷:

(未ac) 哭了,没有真正掌握

var lowestCommonAncestor = function(root, p, q) {const find = function(root,p,q){// 终止条件if(root === null){return null}// 往左递归if(root.val > q.val && root.val > p.val){let left = find(root.left,p,q)if(left != null){return left}}// 往右递归else if(root.val < q.val && root.val < p.val){let right = find(root.right,p,q)if(right != null){return right;}}else{// 如果在中间,根节点就是它的结果return root;}}return find(root,p,q)};

迭代法

var lowestCommonAncestor = function(root, p, q) {// 迭代法while(root){if(root.val > p.val && root.val > q.val){root = root.left}else if(root.val < p.val && root.val < q.val){root = root.right}else{return root}}return null
};

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

class Solution:def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:#终止条件if root is None:newNode = TreeNode(val)return newNode#单层遍历if root.val < val:root.right = self.insertIntoBST(root.right,val)if root.val > val:root.left = self.insertIntoBST(root.left,val)return root

题目并没有要求需要改变树的结构,所以只需要将节点插入叶子节点上。添加节点不需要改二叉树的结构

题目链接/文章讲解:代码随想录

视频讲解:原来这么简单? | LeetCode:701.二叉搜索树中的插入操作_哔哩哔哩_bilibili

二刷:(未ac)

迭代无返回值方法,这种方法更直观,更容易一下子想到

var insertIntoBST = function(root, val) {const find = function(cur,val){// 如果遇到叶子节点,将值插入if(cur === null){let newNode = new TreeNode(val);if(pre.val > val){pre.left= newNode;}else{pre.right= newNode;}return ;}// 记录上一个节点为父节点pre = cur;if(val > cur.val){find(cur.right,val);}if(val < cur.val){find(cur.left,val); }}if(root === null){return new TreeNode(val);}// 先记录当前节点为空let pre = null;find(root,val);return root;
};

递归法有返回值

var insertIntoBST = function(root, val) {const find = function(cur,val){// 终止条件if(cur === null){let newNode = new TreeNode(val);return newNode;}if(val<cur.val){cur.left = find(cur.left,val)}if(val>cur.val){cur.right = find(cur.right,val)}return cur;}if(root === null){return new TreeNode(val);}return find(root,val);
};

迭代法

var insertIntoBST = function(root, val) {// 迭代法if(root === null){return new TreeNode(val);}let cur = root;let pre = null;while(cur){// 移动前记录一下上一个节点的值pre = curif(cur.val > val){cur = cur.left;}else{cur = cur.right;}}// 如果找到了if(pre.val > val){pre.left = new TreeNode(val);}else{pre.right = new TreeNode(val);}return root;
};

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

class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:#终止条件#当没有找到删除的点if root is None:return None#当找到删除的点if root.val == key:#如果是叶子节点if root.left is None and root.right is None:return None#如果非叶子节点elif root.left is not None and root.right is None:return root.leftelif root.left is None and root.right is not None:return root.rightelse:cur = root.right#需要一直遍历到左边最小的数while cur.left:cur = cur.leftcur.left = root.left#删除节点return root.right#左if key < root.val:root.left = self.deleteNode(root.left,key)#右if key > root.val:root.right = self.deleteNode(root.right,key)#返回子树return root

分两种情况:

没找到删除的点

找到了删除的点

删除叶子节点

删除非叶子节点

左为空,右不为空

左为不空,右为空

  左不空,右不空

                        最为复杂,需要满足BTS的特征,所以需要找到右子树的最大的数

中间的处理逻辑是这样的

题目链接/文章讲解:代码随想录

视频讲解:调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点_哔哩哔哩_bilibili

二刷:递归法(未ac)

var deleteNode = function (root, key) {// 终止条件//如果啥都没找到就返回nullif (root === null) {return null;}//分五种情况if (root.val === key) {if (root.left !== null && root.right === null) {return root.left;} else if (root.left === null && root.right !== null) {return root.right;} else if (root.left === null && root.right === null) {//都为空return null;} else {let cur = root.right;// 找右子树的左叶子节点while (cur.left !== null) {cur = cur.left;}cur.left = root.left;root = root.right;return root;}}if (root.val > key) {root.left = deleteNode(root.left, key);}if (root.val < key) {root.right = deleteNode(root.right, key);}return root;
};

算法day22|235,701,450相关推荐

  1. day22 二叉树| 235,701,450

    235. 二叉搜索树的最近公共祖先 可以按照二叉树的最近公共祖先进行操作 也可以按照搜索树的特征,无需进行回溯,从上到下进行遍历 701.二叉搜索树中的插入操作 ​​​​​​​将固定的数值插入到合适的 ...

  2. 力扣235|701|450

    235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 思路 不用改树结构,直接找到空结点位置插入 类似之前的二叉树的公共祖先,由二叉树最下面进行遍历,由下往上,特别关注的是二叉搜索树是一个 ...

  3. 代码随想录Day19 | LC235, 701, 450

    完全二叉树一定是平衡二叉树,堆的排序是父节点大于子节点,而搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树 235. Lowest Common Ancestor of a Binary ...

  4. 代码随想录_二叉树_leetcode 701 450

    leetcode701. 二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树. 返回插入后二叉搜索 ...

  5. 用c语言实现cyk算法,从CYK算法(自然语言处理)生成解析树的步骤

    我目前正在研究一个涉及NLP的项目.我已经实现了一个CKY标识符,如Jurafsky和Martin(算法在页面上450)中给出的.这样生成的表实际上将非终结符存储在表中(而不是通常的布尔值).但是,我 ...

  6. ab,qps,服务器性能压力

    ab,qps,服务器性能压力 作者及来源: 陳聽溪 - 博客园    收藏到→_→: 摘要: ab,qps,服务器性能压力 http://www.makaidong.com/%E5%8D%9A%E5% ...

  7. matlab gui期末设计,MATLABGUI课程设计期末大作业湖南理工学院

    MATLABGUI课程设计期末大作业湖南理工学院 <数字图像处理>期末大作业暨课程考核报告姓名:邓巧灵学号:24112200002序号:02湖南理工学院南湖学院2014 年 6 月2目录一 ...

  8. oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等)

    oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等) oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下 1.获得全拼 SELECT GETHZPY.GETHZFULLPY( ...

  9. 根据用户名字刷账户(取用户名的字母)

    最近由于手动创建用户过于繁琐,就写了个存储过程根据用户名字刷账户. 过滤多余的部分 由于一些名字代有别称,会有一些"("类的符号,所以需要过滤.这里如果有"(" ...

最新文章

  1. android bitmap 饱和度 demo,Android GPUImage实现多种图像滤镜效果
  2. HDU2011 多项式求和【入门】
  3. JMeter下载安装以及使用教程
  4. IE浏览器设置UserAgent
  5. HR 必知的 360 评估
  6. RT Preempt Linux简介
  7. 计算机打开管理闪退,win10任务管理器闪退怎么解决-解决win10任务管理器闪退的方法 - 河东软件园...
  8. MFC Windows 程序设计[253]之美丽的编辑搜索框(附源码)
  9. matlab 动态图只能显示等平面吗,matlab平面浓度图
  10. Node 学习六、核心模块 events之 01 events 和 EventEmitter 类、发布订阅、EventEmitter 类源码解析和模拟实现
  11. ElementUI从PNG开始,自己添加ICON
  12. ecilpse导入项目后报错:Open the Java build path property page of project ‘chapter09‘
  13. 智能手表泄露银行卡密码?专家:不必过分担心
  14. 一阶谓词与一元谓词的区别
  15. 利用k-means算法对灰度图像分割
  16. 【牛客网】 G-大水题
  17. 分众模式下的学员管理
  18. 解析新生代家庭中的steam教育
  19. jquery中添加属性和删除属性--------------------
  20. “理想”有什么理想?

热门文章

  1. 链家武汉租房信息爬取并可视化数据分析
  2. ANDROIDROM制作(一)——ROM结构介绍、精简和内置、一般刷机过程
  3. 回首系列01: 假如我的人生就像是在炒股
  4. ceph 版本升级_Ceph V10.2.0 Jewel正式版本发布
  5. FOC——17.PCB布局和走线
  6. 【零基础学习服装设计】服装色彩搭配试听课_豆瓣
  7. 文件夹加密超级大师V16.85官方版
  8. 尼玛,刚聊完就弹窗推荐,这些 APP 是在偷听吗?
  9. Python猫狗大战代码
  10. Mac 上的 Option 按键图标为什么这样设计?