leetcode 108. Convert Sorted Array to Binary Search Tree 详解 python3

本文介绍如何将一个按升序排列的数组转换为高度平衡的二叉搜索树,确保任意节点的左右子树深度差不超过1。提供递归与非递归两种方法的详细解析及代码实现。

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

一.问题描述

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

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Given the sorted array: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:

      0
     / \
   -3   9
   /   /
 -10  5

二.解题思路

保持左右子树高度差小于等于1,可以把数字分成两半,左边分给左子树,右边分给右子树即能满足题意,两种方法。

1.递归方法

递归方法往往都比非递归简单的多。

确定一下递归返回的条件的递归操作。

如果顺序递归,顺序操作需要加flag判断从左子树来还是从右子树来。

如果反向递归,拿返回值来就不用,代码简洁。具体可以看代码。

2.非递归方法

非递归的话要用堆栈来维持一个节点的进出入状态,具体可以参考以下我写的这篇:

https://blog.csdn.net/CSerwangjun/article/details/102991696

更多leetcode算法题解法: 专栏 leetcode算法从零到结束

三.源码

1.1 顺序递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
# 15
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        n=len(nums)
        if not n: return
        root=TreeNode(nums[int(n/2)])
        self.generateBST(nums[0:int(n/2)],root,'left')
        self.generateBST(nums[int(n/2)+1:],root,'right')
        return root
    
    def generateBST(self,nums,root,flag):
        n=len(nums)
        if not n:return
        mid=int(n/2)
        cur_root=TreeNode(nums[mid]) 
        if flag=='left': root.left=cur_root
        else:root.right=cur_root
        self.generateBST(nums[0:mid],cur_root,'left')
        self.generateBST(nums[mid+1:],cur_root,'right')

1.2 反向递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        return self.generateBST(nums)
    
    def generateBST(self,nums):
        n=len(nums)
        if not n:return
        mid=int(n/2)
        root=TreeNode(nums[mid])
        root.left=self.generateBST(nums[:mid])
        root.right=self.generateBST(nums[mid+1:])
        return root

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值