算法day22|235,701,450
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相关推荐
- day22 二叉树| 235,701,450
235. 二叉搜索树的最近公共祖先 可以按照二叉树的最近公共祖先进行操作 也可以按照搜索树的特征,无需进行回溯,从上到下进行遍历 701.二叉搜索树中的插入操作 将固定的数值插入到合适的 ...
- 力扣235|701|450
235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 思路 不用改树结构,直接找到空结点位置插入 类似之前的二叉树的公共祖先,由二叉树最下面进行遍历,由下往上,特别关注的是二叉搜索树是一个 ...
- 代码随想录Day19 | LC235, 701, 450
完全二叉树一定是平衡二叉树,堆的排序是父节点大于子节点,而搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树 235. Lowest Common Ancestor of a Binary ...
- 代码随想录_二叉树_leetcode 701 450
leetcode701. 二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树. 返回插入后二叉搜索 ...
- 用c语言实现cyk算法,从CYK算法(自然语言处理)生成解析树的步骤
我目前正在研究一个涉及NLP的项目.我已经实现了一个CKY标识符,如Jurafsky和Martin(算法在页面上450)中给出的.这样生成的表实际上将非终结符存储在表中(而不是通常的布尔值).但是,我 ...
- ab,qps,服务器性能压力
ab,qps,服务器性能压力 作者及来源: 陳聽溪 - 博客园 收藏到→_→: 摘要: ab,qps,服务器性能压力 http://www.makaidong.com/%E5%8D%9A%E5% ...
- matlab gui期末设计,MATLABGUI课程设计期末大作业湖南理工学院
MATLABGUI课程设计期末大作业湖南理工学院 <数字图像处理>期末大作业暨课程考核报告姓名:邓巧灵学号:24112200002序号:02湖南理工学院南湖学院2014 年 6 月2目录一 ...
- oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等)
oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等) oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下 1.获得全拼 SELECT GETHZPY.GETHZFULLPY( ...
- 根据用户名字刷账户(取用户名的字母)
最近由于手动创建用户过于繁琐,就写了个存储过程根据用户名字刷账户. 过滤多余的部分 由于一些名字代有别称,会有一些"("类的符号,所以需要过滤.这里如果有"(" ...
最新文章
- android bitmap 饱和度 demo,Android GPUImage实现多种图像滤镜效果
- HDU2011 多项式求和【入门】
- JMeter下载安装以及使用教程
- IE浏览器设置UserAgent
- HR 必知的 360 评估
- RT Preempt Linux简介
- 计算机打开管理闪退,win10任务管理器闪退怎么解决-解决win10任务管理器闪退的方法 - 河东软件园...
- MFC Windows 程序设计[253]之美丽的编辑搜索框(附源码)
- matlab 动态图只能显示等平面吗,matlab平面浓度图
- Node 学习六、核心模块 events之 01 events 和 EventEmitter 类、发布订阅、EventEmitter 类源码解析和模拟实现
- ElementUI从PNG开始,自己添加ICON
- ecilpse导入项目后报错:Open the Java build path property page of project ‘chapter09‘
- 智能手表泄露银行卡密码?专家:不必过分担心
- 一阶谓词与一元谓词的区别
- 利用k-means算法对灰度图像分割
- 【牛客网】 G-大水题
- 分众模式下的学员管理
- 解析新生代家庭中的steam教育
- jquery中添加属性和删除属性--------------------
- “理想”有什么理想?