首页 > 编程语言 >代码随想录算法训练营第22天 |二叉树part07:235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

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

时间:2024-07-15 16:52:53浏览次数:16  
标签:TreeNode val root 二叉 搜索 树中

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

235.二叉搜索树的最近公共祖先
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/
代码随想录:
https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html
701.二叉搜索树中的插入操作
https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/
代码随想录:
https://programmercarl.com/0701.二叉搜索树中的插入操作.html
701.二叉搜索树中的插入操作
https://leetcode.cn/problems/delete-node-in-a-bst/description/
450.删除二叉搜索树中的节点
https://programmercarl.com/0450.删除二叉搜索树中的节点.html#算法公开课

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

题解思路

  • 递归法 利用二叉搜索树的特性 将root.val和p.val和q.val对比 如果属于一边 就搜索该边 否则 就是返回该node
  • 迭代:满足条件就顺边找,不满足条件就直接跳出;

题解代码

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return None
        if root.val>q.val and root.val>p.val:
            return self.lowestCommonAncestor(root.left,p,q)
        elif root.val<p.val and root.val <q.val:
            return self.lowestCommonAncestor(root.right,p,q)
        else:
            return root

```python
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.right
            elif root.val>q.val and root.val>p.val:
                root = root.left
            else:
                return root
        return None

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

题解思路

  • 递归法:如果小于val,插入左边;如果大于val,插入右边;
  • 迭代法:找到需要插入的根节点,直接在根节点插入;

题解代码

class Solution:
    def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            node = TreeNode(val)
            return node
        if root.val>val:
            root.left = self.insertIntoBST(root.left,val)
        else:
            root.right = self.insertIntoBST(root.right,val)
        return root
class Solution:
    def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            node = TreeNode(val)
            return node
        curr = root
        pre = None
        while curr:
            pre = curr
            if curr.val > val:
                curr = curr.left
            else:
                curr = curr.right
        node = TreeNode(val)
        if val<pre.val:
            pre.left = node
        else:
            pre.right = node
        return root

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

题解思路:

  • 根据二叉搜索树的性质;判断哪个子树需要删除;
  • 遇到需要删除的节点:
    • 无左子树;
    • 无右子树;
    • 左右子树都有;

题解代码:

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root:
            return root
        if root.val==key:
            if not root.right:
                return root.left
            elif not root.left:
                return root.right
            else:
                curr = root.right
                while curr.left:
                    curr = curr.left
                curr.left = root.left
                return root.right
        elif root.val>key:
            root.left = self.deleteNode(root.left,key)
        else:
            root.right = self.deleteNode(root.right,key)
        return root

标签:TreeNode,val,root,二叉,搜索,树中
From: https://www.cnblogs.com/P201821440041/p/18303482

相关文章

  • 精准搜索:本地文件检索工具的高效策略
    背景背景1:在日常的工作中,本地磁盘随着工作时间的变长,新建的目录会越来越多存放的文件也越来越多;每次想要找一个文件,确实要浪费一点时间,本着让时间更高效的原则,想着如果借助程序去检索那是不是更快些,于是有了下边的实践。背景2:保险的销售人员也就是业务老师,由于资料过多,找起来确......
  • 搜索枚举_冯政玮
    搜索枚举_冯政玮A-循环赛搜索剪枝题面\(n\) 支队伍比赛,每两支队伍比赛一次,平 \(1\) 胜 \(3\) 负 \(0\)。给出队伍的最终得分,求有多少种可能的分数表。平1胜3负0指:若两支队伍打平,则各得到 \(1\) 分;否则,胜利的队伍得到 \(3\) 分,被打败的队伍得到 \(0\) 分。......
  • 动态库链接和加载时的路径搜索优先级
    目录前言动态库的链接动态库的加载前言在开发一个新项目时遇到了动态库加载异常的问题,因此在这里记录一下动态库的链接和加载过程中库路径的搜索优先级的相关知识。动态库的链接现在有一个main.o可重定位目标文件,其中需要用到开源库log4cpp。在链接的时候,我们可以这样链接:g++......
  • 4. 搜索文件
    4.搜索文件如果一个项目里边的源文件很多,在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦也不现实。所以,在CMake中为我们提供了搜索文件的命令,可以使用aux_source_directory命令或者file命令。4.1方式一在CMake中使用aux_source......
  • ELK Stack - Elasticsearch · 搜索引擎 · 部署应用 · 内部结构 · 倒排索引 · 服
    系列目录ELKStack-Elasticsearch·搜索引擎·全文检索·部署应用·内部结构·倒排索引·服务接入ELKStack-Kibana(待续)ELKStack-Logstash(待续)ELKStack-Beats(待续)ELKStack-ApplicationPerformanceMonitoring(待续)本章基于:RHELinux......
  • 20240713总结(搜索专题,但是不想搜索)
    A-DimaandTrapGraphCF366DDimaandTrapGraph题解:考虑二分满足答案区间,但是发现这个区间并不具有单调性。于是我们考虑固定一个端点(不妨固定左端点),然后二分右端点,此时右端点是有单调性的。然后思考如何判断是否联通。这题可以直接使用并查集,把在当前判断的区间内的边并......
  • LeetCode 144. 二叉树的前序遍历
    更多题解尽在https://sugar.matrixlab.dev/algorithm每日更新。组队打卡,更多解法等你一起来参与哦!LeetCode144.二叉树的前序遍历,难度中等。classSolution{publicvoidpreorderTraversal(TreeNoderoot,List<Integer>ans){if(root==null)re......
  • 力扣-81. 搜索旋转排序数组 II
    1.题目题目地址(81.搜索旋转排序数组II-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/题目描述已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上......
  • 力扣·33. 搜索旋转排序数组
    1.题目题目地址(33.搜索旋转排序数组-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array/题目描述整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[n......
  • 数据结构第25节 深度优先搜索
    深度优先搜索(Depth-FirstSearch,简称DFS)是一种用于遍历或搜索树或图的算法。DFS从根节点开始,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到上一个节点w,然后探索w的其他未搜索过的子节点。DFS有两种常用的方式:递归方式和非递归方式(通常使用栈来实......