【Python刷题】将有序数组转换为二叉搜索树

问题描述

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

高度平衡的意思是:二叉树是一颗满足“每个结点的左右两个子树的高度差的绝对值不超过1”的二叉树。

示例 1:
在这里插入图片描述

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

在这里插入图片描述

示例 2:
在这里插入图片描述

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3][3,1] 都是高度平衡二叉搜索树。

解决办法

因为是平衡二叉树,所以总是要选取中间节点,比如在示例一中[-10,-3,0,5,9],先选取中间节点0,然后再分别同时选取两边数字的左侧[-10,5]或者右侧[-3,9]节点 。

  • 中序遍历,总是选择中间位置左边的数字作为根节点
  • 中间位置左边的数字作为根节点,则根节点的下标为mid=(left+right)//2
    具体实现步骤:
  • 对数组的下标进行遍历,首先排除特殊情况,定义左右边界下标,如果左边的索引大于右边的索引,则返回None
  • 第二个特殊情况,如果左右数的索引相等,那么说明只有一个根结点,则建立一个只有根结点的树
  • 排除掉这两中情况后,选取中间节点,即mid=[l+r]//2,将其设置为根结点
  • 再分别采用递归的方法设置左子树和右子树

代码示例

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        def arrayToBst(l,r):
            if l > r:
                return None
            if l == r:
                return TreeNode(nums[l],None,None)  #建立一棵树,左、右子树都为空
            else:
                mid = ( l + r ) // 2
                root=TreeNode(nums[mid])
                root.left = arrayToBst(l,mid-1)
                root.right = arrayToBst(mid+1,r)
                return root
        return arrayToBst(0,len(nums)-1)
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值