leetcode修炼------108、110题

本文详细解析了如何将升序数组转换为平衡二叉搜索树,以及如何判断一棵二叉树是否为平衡二叉树。通过递归算法实现,确保了树的平衡性,同时提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第108题:

"

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

"

题目大意:给你一个按照升序排序的数组,你将它转换为平衡二叉树。

题目链接

解题思路:首先明确平衡二叉树的定义:

(1)它是一棵二叉排序树,即根节点的值大于左子树节点的值,小于右子树节点的值。

(2)除了性质1之外,还要求每棵树的左右子树的深度之差不能超过1

其实说白了,要满足条件(2),我们只是需要将已经排序好的数组进行二分即可,这样既能满足条件(1)也能满足条件(2),个人在做试题的时候,主要到考察到树的部分的时候,一定要多往递归方向去做。

下面就直接给出代码了:

class Solution:
    def sortedArrayToBST(self, nums: list(int)) -> TreeNode:
        if nums is None or len(nums)==0:
            return None
        return self.fun(nums,0,len(nums)-1)

    def fun(self,nums,min,max)->TreeNode:
        if min>max:
            return None
        mid=(min+max)//2
        node=TreeNode(nums[mid])
        node.left=self.fun(nums,min,mid-1)
        node.right=self.fun(nums,mid+1,max)
        return node

第110题:

"

Given a binary tree, determine if it is height-balanced.

"

题目大意:给出一棵二叉树,判断它是不是平衡二叉树

题目链接

解题思路:关于平衡二叉树,就不继续说了,可以参考上面的内容,但是这题没有第一个要求,只是需要判断它是不是高度平衡的,只需要满足条件(2)即可,本题主要是得到树的高度的计算,也就是可以直接计算树的高度:采用递归的思想,先计算左子树的高度,再计算右子树的高度,相比取最大的数,然后加上1(根节点是第一层)

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        import math
        if not root:
            return True
        else:
            left_height=self.height(root.left)
            right_height=self.height(root.right)
            if math.fabs(left_height-right_height)>1:
                return False
            else:
                return self.isBalanced(root.left) and self.isBalanced(root.right)

    def height(self, root:TreeNode)->int:
        if not root:
            return 0
        left_height=self.height(root.left)
        right_height=self.height(root.right)
        if left_height>right_height:
            return left_height+1
        else:
            return right_height+1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值