一.问题描述
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