📅  最后修改于: 2023-12-03 14:49:30.227000             🧑  作者: Mango
二叉搜索树是一种基于二叉树的数据结构,它定义了一种数据元素的排列方式,使得每个节点的左子树中的结点值都小于该节点的值,而右子树中的节点值都大于该节点的值。在本文中,我们将介绍如何从一个给定数组中构建一棵二叉搜索树,并通过排序打印的方式展示它。
在二叉搜索树中,每个结点都有左、右指针和一个值。我们可以使用递归来构建一棵二叉搜索树,其中每一层递归都选择数组中的中间元素作为当前结点。我们将该中间元素作为根节点,对数组的左半部分和右半部分重复这个过程,直到处理的子数组为空。过程示意图如下:
graph LR;
A[2, 4, 6, 8, 10]-->B[2, 4];
A-->C[6, 8, 10];
B-->D[2];
B-->E[4];
C-->F[6];
C-->G[8, 10];
G-->H[8];
G-->I[10];
在上图中,我们将给定数组 [2, 4, 6, 8, 10]
划分成左子数组 [2, 4]
和右子数组 [6, 8, 10]
,根据递归过程,结点值为 6
的结点成为了根结点,值为 2
和 4
的元素被划分至其左子数组,值为 8
和 10
的元素被划分至其右子数组。
代码实现如下:
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def sortedArrayToBST(nums):
if not nums:
return None
mid = len(nums) // 2
# 中间元素作为根节点
root = TreeNode(nums[mid])
# 递归构建左子树和右子树
root.left = sortedArrayToBST(nums[:mid])
root.right = sortedArrayToBST(nums[mid+1:])
return root
为了输出二叉搜索树,我们需要按照中序遍历的方式进行输出,即先输出左子树,再输出根结点,最后输出右子树。代码实现如下:
def inorderTraversal(root):
if not root:
return []
trav = []
trav += inorderTraversal(root.left)
trav.append(root.val)
trav += inorderTraversal(root.right)
return trav
if __name__ == '__main__':
nums = [2, 4, 6, 8, 10]
root = sortedArrayToBST(nums)
print(inorderTraversal(root))
输出为:
[2, 4, 6, 8, 10]
通过给定数组排序打印代表二叉搜索树是一项基本算法。我们可以使用递归构建一棵二叉搜索树,并通过中序遍历获取排序后的数组。该算法的时间复杂度为 $O(n)$,其中 $n$ 是数组的长度。