代码随想录算法训练营Day20

力扣235.二叉搜索树的最近公共祖先 【medium】
力扣701.二叉搜索树的插入操作 【medium】
力扣450.删除二叉搜索树中的节点【medium】

一、力扣235.二叉搜索树的最近公共祖先【medium】

题目链接:力扣235.二叉搜索树的最近公共祖先

文档链接:代码随想录

1、思路

  • 要利用二叉搜索树有序的性质
  • 题目说了p、q都在树中,所以我们可以通过遍历往下缩小范围
  • 这边不用判断空节点,因为pq的存在性和树的有序性,所以这边不会递归到空节点
  • 时间复杂度: O ( n ) O(n) O(n)

2、代码

python 复制代码
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        x = root.val
        if x < p.val and x < q.val:
            return self.lowestCommonAncestor(root.right, p, q)
        if x > p.val and x > q.val:
            return self.lowestCommonAncestor(root.left, p , q)
        return root

二、力扣701.二叉搜索树的插入操作【medium】

题目链接:力扣701.二叉搜索树的插入操作

文档链接:代码随想录

1、思路

  • 可以不改变树的结构,这样这道题就简单了
  • 通过比较
  • 时间复杂度: O ( n ) O(n) O(n)

2、代码

python 复制代码
class Solution:
    def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            return TreeNode(val)
        if root.val > val:
            root.left = self.insertIntoBST(root.left , val)
        if root.val < val:
            root.right = self.insertIntoBST(root.right , val)
        return root

三、力扣450.删除二叉搜索树中的节点【medium】

题目链接:力扣450.删除二叉搜索树中的节点

文档链接:代码随想录

1、思路

  • 遍历中寻找key,并不全遍历
  • 删除节点的操作在终止条件
  • 好好理解终止条件的return和最后的return root,这个过程中它就删除了目标节点并且把目标节点的孩子接向了它的父亲
  • 时间复杂度: O ( n ) O(n) O(n)

2、代码

python 复制代码
class Solution:
    def deleteNode(self, root, key):
        if root is None:
            return root
        if root.val == key:
            if root.left is None and root.right is None:
                return None
            elif root.left is None:
                return root.right
            elif root.right is None:
                return root.left
            else:
                cur = root.right
                while cur.left is not None:
                    cur = cur.left
                cur.left = root.left
                return root.right
        if root.val > key:
            root.left = self.deleteNode(root.left, key)
        if root.val < key:
            root.right = self.deleteNode(root.right, key)
        return root

相关推荐
hetao17338374 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan5 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356386 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah6 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO96 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician6 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.6 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o7 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者8 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express