Python算法练习 10.28

leetcode 700 二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null

示例 1:

复制代码
输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

示例 2:

复制代码
输入:root = [4,2,7,1,3], val = 5
输出:[]

输出这么写我总以为是返回子树值的列表,结果是直接返回子树根节点

原来二叉搜索树就是二叉排序树,然而我直接暴力深搜。。。

python 复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def searchBST(self, root, val):
        """
        :type root: TreeNode
        :type val: int
        :rtype: TreeNode
        """
        childRoot = None
        def nextLevel(root, val):
            if root.val == val:
                return root
            if root.left:
                targetLeft = nextLevel(root.left, val)
                if targetLeft:
                    return targetLeft
            if root.right:
                targetRight = nextLevel(root.right, val)
                if targetRight:
                    return targetRight
            return None
            
        if root.val == val:
            return root
        if root.left:
            childRoot = nextLevel(root.left, val)
        if not childRoot and root.right:
            childRoot = nextLevel(root.right, val)
        return childRoot

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

给定一个二叉搜索树的根节点 root 和一个值 key ,删除二叉搜索树中的 key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

复制代码
输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

示例 2:

复制代码
输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

复制代码
输入: root = [], key = 0
输出: []

写不出来,直接看评论题解了

这个方法最妙的地方就是把要删除的节点看成根节点

然后以目标节点为根,分情况:

  1. 无左右子树:直接删除
  2. 只有左子树:左子树的根节点作为该结点
  3. 只有右子树:右子树的根节点作为该结点
  4. 左右子树都有:找到右子树中最小的结点(记为rMin),将rMin在右子树中删除,用rMin代替root,把root.left赋给rMin.left,root.right赋给rMin.right
python 复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def deleteNode(self, root, key):
        """
        :type root: TreeNode
        :type key: int
        :rtype: TreeNode
        """
        if not root:
            return None
        if key == root.val:
            if not (root.left or root.right):
                return None
            elif not root.left:
                return root.right
            elif not root.right:
                return root.left
            else:
                rMin = root.right
                while rMin.left:   #找到右子树里的最小值节点放到要删除的节点去
                    rMin = rMin.left
                rMin.right = self.deleteNode(root.right, rMin.val)   #删除原来右子树里的最小值节点
                rMin.left = root.left
                return rMin
        if key < root.val:
            root.left = self.deleteNode(root.left, key)
        if key > root .val:
            root.right = self.deleteNode(root.right,key)
        return root
相关推荐
cpp_250122 分钟前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
月光船幽幽25 分钟前
门控函数SHS阈值与调制机制解析
人工智能·python·算法
测试199826 分钟前
2026全新软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
Doraemomo34 分钟前
数据结构-哈希表
数据结构·算法·散列表
Zane199435 分钟前
map 比推导式快"是真的吗?一文讲透 map、filter、reduce 与 lambda 的真实性能与设计取舍
后端·python
君君思密达41 分钟前
Leetcode Hot 100 题目详解-哈希表
数据结构·算法·leetcode
lucas_AI41 分钟前
Muse Glimmer 30B:Meta 难得给的真开源,强在哪、虚在哪
人工智能·算法
ai产品老杨1 小时前
国产NPU视觉算法完整流程
算法
过期的秋刀鱼!1 小时前
带替换的采样
人工智能·python·算法·决策树·机器学习
Python私教1 小时前
AI Agent 可观测性不只是日志:一套可回放的多步执行链
人工智能·后端·python