
2种解法 - 将二叉搜索树变平衡
中序遍历生成有序数组:首先,我们对原始二叉搜索树进行中序遍历,将节点值按顺序记录到一个列表中。这种方法保证了生成的列表是有序的。 构造平衡二叉搜索树:使用二分法思想,从列表中选择中间元素作为根节点,递归地处理左右子树。这种方法确保每次分割后,左右子树的高度差不超过1,从而构造出平衡二叉搜索树。 递归构造:在构造过程中,递归地从列表中分割出左右子数组,分别构造左子树和右子树。每次选择中间的元素作为当前节点,确保树的平衡性。 TreeNode类:定义了二叉搜索树的节点,每个节点包含一个值,左子树和右子树。 get_values函数:通过中序遍历填充节点值到列表中。 build_balanced_tree函数:递归地构造平衡二叉搜索树。使用二分法选择根节点,递归处理左右子树。 balance_binary_search_tree函数:主函数,处理输入根节点,调用中序遍历和平衡树构造函数。 示例使用:创建原始树结构,并通过主函数生成平衡树。
发布日期:2021-05-08 16:54:43
浏览次数:21
分类:精选文章
本文共 1549 字,大约阅读时间需要 5 分钟。
为了构造平衡二叉搜索树,我们可以使用中序遍历生成有序数组,然后基于二分法构造平衡树。以下是详细的步骤和代码实现:
步骤说明
代码实现
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))
代码解释
这种方法确保构造的平衡树满足题目要求,时间复杂度为O(n),空间复杂度为O(n)。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月19日 19时12分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2024年非科班的人合适转行做程序员吗?
2023-01-24
Java基础:按位运算符
2023-01-29
LeetCode Text Justification
2023-01-31
leftjoin多个on条件_MySQL:left join 避坑指南
2023-01-31
libmpg123 解码库用法
2023-01-31
LibTorch之激活函数层
2023-01-31
LibTorch实现MLP(多层感知机)
2023-01-31
LibTorch框架学习
2023-01-31
libvirt TLS
2023-01-31
License Server上找不到指定版本的XenApp License
2023-01-31
License授权
2023-01-31
liferay 去掉 portlet:actionUrl 跳转时的message
2023-01-31
Liferay7 BPM门户开发之21: 理解消息总线(Message Bus)体系
2023-01-31
Light OJ 1005
2023-01-31
Lineage逻辑回归分类算法
2023-01-31
linglong扫描系统 JWT密钥硬编码 登录绕过漏洞复现
2023-01-31
LINQ to Objects---立即执行的Enumerable类方法
2023-01-31
linq to sql 三层架构中使用CRUD操作
2023-01-31