将升序数组转化为平衡二叉搜索树

将升序数组转化为平衡二叉搜索树

问题描述

给定一个升序排序的数组,将其转化为平衡二叉搜索树(BST)。平衡二叉搜索树是指树上的每个节点 node 都满足左子树中所有节点的的值都小于 node 的值,右子树中所有节点的值都大于 node 的值,并且左右子树的节点数量之差不大于1。

示例:

输入:nums = [-10,-3,0,5,9]

输出:[0,-3,9,-10,null,5]

将升序数组转化为平衡二叉搜索树

分析问题

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:3494611f-c905-43ec-b120-3c7b3fc6b116

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:c0410496-f6c6-46e2-a707-294b4a8b2726

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:68bf4fa2-f389-4f8f-a77a-56bf22f93879

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:68f86504-3d24-44b3-b936-78059b04eb0c

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:1def607e-a7f0-408d-ab9e-5147f6967478

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:dfedc147-6451-4210-82be-15b0ed456977

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:7dde6bf8-996b-4ee6-824e-4c219f70cfa5

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:e8d9519f-01c3-4c93-9ed5-ebd2c37e48b2

方法一

选择中间位置左边的数字作为根节点,则根节点的下标为 mid=(left+right) // 2。

将升序数组转化为平衡二叉搜索树
class Solution:
    def sortedArrayToBST(self, nums):

        def cur(left, right):
            if left > right:
                return None

            #选择中间位置左边的数字作为根节点
            mid = (left + right) // 2
            root = TreeNode(nums[mid])
            #递归求解左右子树
            root.left = cur(left, mid - 1)
            root.right = cur(mid + 1, right)
            return root

        return cur(0, len(nums) - 1)

方法二:

选择中间位置右边的数字作为根节点,则根节点的下标为 mid=(left+right+1) // 2。

将升序数组转化为平衡二叉搜索树
class Solution:
    def sortedArrayToBST(self, nums):

        def cur(left, right):
            if left > right:
                return None

            #选择中间位置右边的数字作为根节点
            mid = (left + right + 1) // 2
            root = TreeNode(nums[mid])
            #递归求解左右子树
            root.left = cur(left, mid - 1)
            root.right = cur(mid + 1, right)
            return root

        return cur(0, len(nums) - 1)

方法三

选择任意一个中间位置数字作为根节点,则根节点的下标mid在(left+right)//2 和 (left+right+1)/2 中随机选择一个。

import random
class Solution:
    def sortedArrayToBST(self, nums):

        def cur(left, right):
            if left > right:
                return None

            #选择中间位置随机一个作为根节点
            random_data= random.randint(0, 1)
            mid = (left + right + random_data) // 2
            root = TreeNode(nums[mid])
            #递归求解左右子树
            root.left = cur(left, mid - 1)
            root.right = cur(mid + 1, right)
            return root

        return cur(0, len(nums) - 1)

Original: https://www.cnblogs.com/cxyxz/p/15545948.html
Author: 算法推荐管
Title: 将升序数组转化为平衡二叉搜索树

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/562435/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球