• LeetCode,二叉搜素树


    1. 修剪二叉搜索树

    LeetCode569. 力扣

    给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

    所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

    图1. 修剪二叉搜索树示例

    分析:

    (1)对于当前节点的值:

    如果当前的节点<下界,那么,看该节点的右子树(看比较大的一边);若当前节点>上界,那么,看该节点的左子树(看比较小的一边);

    (2)对当前节点的左右子树:

    如果当前节点的右节点>上界,看右节点的左子树是否满足上界条件(小于上界),若满足,则将当前节点的右指针指向右节点的左子树;

    如果当前节点的左节点<下界,看左节点的右子树是否满足下界条件(大于下界),若满足,则将当前节点的左指针指向左节点的右子树。

    每一个节点都是如此,因此结构为递归结构。

    2. 将有序数组转化为二叉搜索树

    LeetCode108. 力扣

    给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

    高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

     图2. 将有序数组转化为二叉搜索树

    分析,以数组[-10, -3, 0, 5, 9]为例,

    首先,为了保障二叉搜索树为一个平衡树,那么,左右子树的节点个数必须保证不能相差太大,因此,选取的根节点为中间的节点,索引为i = int(len(nums)/2)

    (1)若 i 不是最后一个元素,则其右子树为:

    nums[i+1 : ]

    构造平衡二叉搜索树的方式同理;

    (2)若 i 不是第一个元素,则其左子树为:

    nums[ : i]

    构造平衡二叉搜素树的方式同理。

    由该分析知,构造该平衡二叉搜素树的算法为递归结构。

    3. 代码

    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. def set_left(self, left):
    8. self.left = left
    9. def set_right(self, right):
    10. self.right = right
    11. class Solution(object):
    12. def trimBST(self, root, low, high):
    13. """
    14. :type root: TreeNode
    15. :type low: int
    16. :type high: int
    17. :rtype: TreeNode
    18. """
    19. current = root
    20. if current.val < low:
    21. if current.right != None:
    22. return self.trimBST(current.right, low, high)
    23. else:
    24. return None
    25. elif current.val > high:
    26. if current.left != None:
    27. return self.trimBST(current.left, low, high)
    28. else:
    29. return None
    30. if current.left != None:
    31. if current.left.val < low:
    32. if current.left.right != None:
    33. current.left = self.trimBST(current.left.right, low, high)
    34. else:
    35. current.left = None
    36. else:
    37. current.left = self.trimBST(current.left, low, high)
    38. if current.right != None:
    39. if current.right.val > high:
    40. if current.right.left != None:
    41. current.right = self.trimBST(current.right.left, low, high)
    42. else:
    43. current.right = None
    44. else:
    45. current.right = self.trimBST(current.right, low, high)
    46. return root
    47. def sortedArrayToBST(self, nums):
    48. """
    49. :type nums: List[int]
    50. :rtype: TreeNode
    51. """
    52. i = int(len(nums)/2)
    53. root = TreeNode(nums[i])
    54. if i == len(nums)-1:
    55. root.right = None
    56. else:
    57. root.right = self.sortedArrayToBST(nums[i+1:])
    58. if i == 0:
    59. root.left = None
    60. else:
    61. root.left = self.sortedArrayToBST(nums[:i])
    62. return root

     

  • 相关阅读:
    在Linux下安装MySQL
    周少剑,很少见
    针对语音服务提供厂商的记录(2022-08-16)
    无人机实践:DJI A3 飞控---详情
    Centos7安装MySQL5.7全部流程
    【记录】mmsegmentation 训练自己的数据集
    conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决
    LeetCode-78-子集
    用百度云怎么重装电脑系统
    第58篇-京东滑块流程分析【2023-09-26】
  • 原文地址:https://blog.csdn.net/qq_45031079/article/details/125473569