题目:将有序数组转换成二叉搜素树
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树
例1
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
知识点:
二叉树的前,中,后序遍历(详细介绍)
1.前序遍历(DLR):根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面
2.中序遍历(LDR):根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面
3.后序遍历(LRD):根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面
eg:
class treeNode(object):
def __init__(self, val = 0, left = None, right = None):
self.val = val
self.left = left
self.right = right
root = treeNode(4)
root.left = treeNode(3)
root.left.left = treeNode(2)
root.left.right = treeNode(1)
root.right = treeNode(7)
root.right.left = treeNode(6)
num = []
def preorder(root, num): # 前序遍历
if not root:
return None
num.append(root.val)
preorder(root.left, num)
preorder(root.right, num)
return num
print(preorder(root, num))
# 输出:[4, 3, 2, 1, 7, 6]
num = []
def inorder(root, num):# 中序遍历
if not root:
return None
inorder(root.left, num)
num.append(root.val)
inorder(root.right, num)
return num
print(inorder(root, num))
# 输出:[2, 3, 1, 4, 6, 7]
num = []
def postorder(root, num):# 后序遍历
if not root:
return None
postorder(root.left, num)
postorder(root.right, num)
num.append(root.val)
return num
print(postorder(root, num))
#输出:[2, 1, 3, 6, 7, 4]
思路:
BST的中序遍历是有序的,所以本题可理理解为将中序遍历出的序列恢复为二叉搜索树,且要求为高度平衡,所以选取的节点需要为中间的元素,以该元素的左边构建左子树,以该元素的右边构建右子树,通过递归的方式完成。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
def creatTree(left, right):
if left > right:
return None
mid = (left + right) // 2
root = TreeNode(nums[mid])
root.left = creatTree(left, mid - 1)
root.right = creatTree(mid + 1, right)
return root
return creatTree(0, len(nums) - 1)