0108-有序数组转为二叉搜索树

给你一个整数数组 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,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree

参考:

python

# 0108.将有序数组构造为二叉搜索树
class Solution1:
def sortedArrayToBST(self, nums: [int]) -> TreeNode:
"""
递归-左闭右开
:param nums:
:return:
"""
def sortedToBST(nums: [int], left: int, right: int) -> TreeNode:
if left >= right:
return None
if right - left == 1:
return TreeNode(nums[left])
# 若为偶数,取的为中间两值的左值
mid = left + int((right-left)/2)
root = TreeNode(nums[mid])
# [left, mid)
root.left = sortedToBST(nums, left, mid)
# [mid+1, right)
root.right = sortedToBST(nums, mid+1, right)
return root
return sortedToBST(nums, 0, len(nums))
class Solution2:
def sortedArrayToBST(self, nums: [int]) -> TreeNode:
"""
递归-左闭右闭
:param nums:
:return:
"""
def sortedToBST(nums: [int], left: int, right: int) -> TreeNode:
if left > right:
return None
mid = left + int((right-left)/2)
root = TreeNode(nums[mid])
root.left = sortedToBST(nums, left, mid-1)
root.right = sortedToBST(nums, mid+1, right)
return root
return sortedToBST(nums, 0, len(nums)-1)
class Solution3:
def sortedArrayToBST(self, nums: [int]) -> TreeNode:
"""
迭代-左闭右闭-LC超时
:param nums:
:return:
"""
if len(nums) == 0:
return None
# root initial
root = TreeNode(-1)
# 维护三个队列,节点队列,左部节点下标队列,右部节点下标队列
nodeQueue = []
leftQueue = []
rightQueue = []
# 根节点入队
nodeQueue.append(root)
# 下标队列入队
leftQueue.append(0)
rightQueue.append(len(nums)-1)
while nodeQueue:
curNode = nodeQueue.pop(0)
left = leftQueue.pop(0)
right = rightQueue.pop(0)
mid = left + int((right-left)>>1)
# 中间节点
curNode.val = nums[mid]
# 左区间构造二叉树
if left <= mid -1:
curNode.left = TreeNode(-1)
nodeQueue.append(curNode.left)
leftQueue.append(left)
rightQueue.append(mid-1)
# 右区间构造二叉树
if right >= mid -1:
curNode.right = TreeNode(-1)
nodeQueue.append(curNode.right)
leftQueue.append(mid+1)
rightQueue.append(right)
return root

golang

package binaryTree
import "container/list"
func sortedArrayToBST(nums []int) *TreeNode {
// 递归-左闭右开
if len(nums)==0{return nil}//终止条件,最后数组为空则可以返回
root:=&TreeNode{nums[len(nums)/2],nil,nil}//按照BSL的特点,从中间构造节点
root.Left=sortedArrayToBST(nums[:len(nums)/2])//数组的左边为左子树
root.Right=sortedArrayToBST(nums[len(nums)/2+1:])//数字的右边为右子树
return root
}
func sortedArrayToBST2(nums []int) *TreeNode {
// 递归-左闭右闭
var sortedToBST func(nums []int, left int, right int) *TreeNode
sortedToBST = func(nums []int, left int, right int) *TreeNode {
if left > right {
return nil
}
var mid int = left + (right-left) >> 1
root := &TreeNode{Val: nums[mid]}
root.Left = sortedToBST(nums, left, mid-1)
root.Right = sortedToBST(nums, mid+1, right)
return root
}
return sortedToBST(nums, 0, len(nums)-1)
}
func sortedArrayToBST3(nums []int) *TreeNode {
// 迭代-左闭右闭-LC超时
if len(nums) == 0 {
return nil
}
// 根节点初始化
root := &TreeNode{Val: -1}
// 维护三个队列,节点队列,左区间下标队列,右区间下标队列
nodeQueue := list.New()
leftQueue := []int{}
rightQueue := []int{}
// 节点&下标入队
nodeQueue.PushBack(root)
leftQueue = append(leftQueue,0)
rightQueue = append(rightQueue,len(nums)-1)
// 构造二叉搜索树
for nodeQueue.Len() > 0 {
// 出队
curNode := nodeQueue.Remove(nodeQueue.Front()).(*TreeNode)
left := leftQueue[0]
if len(leftQueue) == 1{
leftQueue = []int{}
} else {
leftQueue = leftQueue[1:]
}
right := rightQueue[0]
if len(rightQueue) == 1{
rightQueue = []int{}
} else {
rightQueue = rightQueue[1:]
}
var mid int = left + (right-left) >> 1
// 中间节点
curNode.Val = nums[mid]
// 左右区间构造二叉树
if left <= mid -1 {
curNode.Left = &TreeNode{Val: -1}
nodeQueue.PushBack(curNode.Left)
leftQueue = append(leftQueue, left)
rightQueue = append(rightQueue, mid-1)
}
if right >= mid -1 {
curNode.Right = &TreeNode{Val: -1}
nodeQueue.PushBack(curNode.Right)
leftQueue = append(leftQueue, mid+1)
rightQueue = append(rightQueue, right)
}
}
return root
}

posted on   进击的davis  阅读(40)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示