2种解法 - 将二叉搜索树变平衡
发布日期:2021-05-08 16:54:43 浏览次数:21 分类:精选文章

本文共 1549 字,大约阅读时间需要 5 分钟。

为了构造平衡二叉搜索树,我们可以使用中序遍历生成有序数组,然后基于二分法构造平衡树。以下是详细的步骤和代码实现:

步骤说明

  • 中序遍历生成有序数组:首先,我们对原始二叉搜索树进行中序遍历,将节点值按顺序记录到一个列表中。这种方法保证了生成的列表是有序的。
  • 构造平衡二叉搜索树:使用二分法思想,从列表中选择中间元素作为根节点,递归地处理左右子树。这种方法确保每次分割后,左右子树的高度差不超过1,从而构造出平衡二叉搜索树。
  • 递归构造:在构造过程中,递归地从列表中分割出左右子数组,分别构造左子树和右子树。每次选择中间的元素作为当前节点,确保树的平衡性。
  • 代码实现

    class TreeNode:    def __init__(self, val):        self.val = val        self.left = None        self.right = Nonedef get_values(node, list_values):    if node is None:        return    get_values(node.left, list_values)    list_values.append(node.val)    get_values(node.right, list_values)def build_balanced_tree(values):    def create_tree(left, right):        if left > right:            return None        mid = (left + right) // 2        current_val = values[mid]        node = TreeNode(current_val)        node.left = create_tree(left, mid - 1)        node.right = create_tree(mid + 1, right)        return node    return create_tree(0, len(values) - 1)def balance_binary_search_tree(root):    if not root:        return None    values = []    get_values(root, values)    return build_balanced_tree(values)# 示例使用root = TreeNode(1)root.right = TreeNode(2)root.right.right = TreeNode(3)root.right.right.right = TreeNode(4)balanced_tree = balance_binary_search_tree(root)# 转换为字符串以便查看print(str(balanced_tree))

    代码解释

  • TreeNode类:定义了二叉搜索树的节点,每个节点包含一个值,左子树和右子树。
  • get_values函数:通过中序遍历填充节点值到列表中。
  • build_balanced_tree函数:递归地构造平衡二叉搜索树。使用二分法选择根节点,递归处理左右子树。
  • balance_binary_search_tree函数:主函数,处理输入根节点,调用中序遍历和平衡树构造函数。
  • 示例使用:创建原始树结构,并通过主函数生成平衡树。
  • 这种方法确保构造的平衡树满足题目要求,时间复杂度为O(n),空间复杂度为O(n)。

    上一篇:3种解法 - 实现字符串压缩
    下一篇:Python编码规范

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月19日 19时12分44秒