• 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
    输出:[]

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

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

    1. # Definition for a binary tree node.
    2. # class TreeNode(object):
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution(object):
    8. def searchBST(self, root, val):
    9. """
    10. :type root: TreeNode
    11. :type val: int
    12. :rtype: TreeNode
    13. """
    14. childRoot = None
    15. def nextLevel(root, val):
    16. if root.val == val:
    17. return root
    18. if root.left:
    19. targetLeft = nextLevel(root.left, val)
    20. if targetLeft:
    21. return targetLeft
    22. if root.right:
    23. targetRight = nextLevel(root.right, val)
    24. if targetRight:
    25. return targetRight
    26. return None
    27. if root.val == val:
    28. return root
    29. if root.left:
    30. childRoot = nextLevel(root.left, val)
    31. if not childRoot and root.right:
    32. childRoot = nextLevel(root.right, val)
    33. 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
    1. # Definition for a binary tree node.
    2. # class TreeNode(object):
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution(object):
    8. def deleteNode(self, root, key):
    9. """
    10. :type root: TreeNode
    11. :type key: int
    12. :rtype: TreeNode
    13. """
    14. if not root:
    15. return None
    16. if key == root.val:
    17. if not (root.left or root.right):
    18. return None
    19. elif not root.left:
    20. return root.right
    21. elif not root.right:
    22. return root.left
    23. else:
    24. rMin = root.right
    25. while rMin.left: #找到右子树里的最小值节点放到要删除的节点去
    26. rMin = rMin.left
    27. rMin.right = self.deleteNode(root.right, rMin.val) #删除原来右子树里的最小值节点
    28. rMin.left = root.left
    29. return rMin
    30. if key < root.val:
    31. root.left = self.deleteNode(root.left, key)
    32. if key > root .val:
    33. root.right = self.deleteNode(root.right,key)
    34. return root

     

     

  • 相关阅读:
    MySQL的MHA高可用群集
    Vue2+elementui项目导出el-table的数据为xlsx表格
    尚品汇_第5章_ 商品sku保存
    【医学大模型】Text2MDT :从医学指南中,构建医学决策树
    i7 11800h和i7 12800hx选哪个好
    一文带你入门SpringMVC
    ThreadPoolExecutor BlockingQueue讲解
    react+nextjs配置跨域不生效
    SpringBoot 刷新上下文6--加载并注册BeanDefinition
    一键PDF转Word,PP-Structurev2文档分析模型深度解读!
  • 原文地址:https://blog.csdn.net/Michelle209/article/details/134088756