题目:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
解答:
方法一:递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructTree(self,nums,left,right):
if left>right:
return None
mid=left+(right-left)//2
root=TreeNode(nums[mid])
root.left=self.constructTree(nums,left,mid-1)
root.right=self.constructTree(nums,mid+1,right)
return root
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
left,right=0,len(nums)-1
return self.constructTree(nums,left,right)
方法二:迭代
使用三个队列分别存储:遍历结点,左端点值,右端点值
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
if not nums:
return None
left,right=0,len(nums)-1
root=TreeNode()
nq=collections.deque()
nq.append(root)
lq=collections.deque()
lq.append(left)
rq=collections.deque()
rq.append(right)
while nq or lq or rq:
curnode=nq.popleft()
left=lq.popleft()
right=rq.popleft()
mid=left+(right-left)//2
curnode.val=nums[mid]
#构建左子树结点
if left<=mid-1:
curnode.left=TreeNode()
nq.append(curnode.left)
lq.append(left)
rq.append(mid-1)
#构建右子树结点
if right>=mid+1:
curnode.right=TreeNode()
nq.append(curnode.right)
lq.append(mid+1)
rq.append(right)
return root