📜  代表BST的给定数组的排序打印(1)

📅  最后修改于: 2023-12-03 14:49:30.227000             🧑  作者: Mango

通过给定数组排序打印代表二叉搜索树(BST)

介绍

二叉搜索树是一种基于二叉树的数据结构,它定义了一种数据元素的排列方式,使得每个节点的左子树中的结点值都小于该节点的值,而右子树中的节点值都大于该节点的值。在本文中,我们将介绍如何从一个给定数组中构建一棵二叉搜索树,并通过排序打印的方式展示它。

实现方法
构建二叉搜索树

在二叉搜索树中,每个结点都有左、右指针和一个值。我们可以使用递归来构建一棵二叉搜索树,其中每一层递归都选择数组中的中间元素作为当前结点。我们将该中间元素作为根节点,对数组的左半部分和右半部分重复这个过程,直到处理的子数组为空。过程示意图如下:

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 的结点成为了根结点,值为 24 的元素被划分至其左子数组,值为 810 的元素被划分至其右子数组。

代码实现如下:

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$ 是数组的长度。