代码随想录算法训练营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

相关推荐
屁股割了还要学30 分钟前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代44 分钟前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
阿彬爱学习2 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain2 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
啊阿狸不会拉杆5 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
qiuyunoqy5 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
lifallen6 小时前
Kafka ISR机制和Raft区别:副本数优化的秘密
java·大数据·数据库·分布式·算法·kafka·apache
m0_626535207 小时前
贪心算法学习 3 买卖股票的最佳时机 i ii
学习·算法·贪心算法
zxctsclrjjjcph7 小时前
【递归、搜索和回溯】FloodFill 算法介绍及相关例题
c++·算法·leetcode·宽度优先·深度优先遍历
机器学习之心7 小时前
灰狼算法+四模型对比!GWO-CNN-LSTM-Attention系列四模型多变量时序预测
算法·cnn·lstm·gwo-cnn-lstm