LeetCode 1382. 将二叉搜索树变平衡 详细解析(Python版)
LeetCode 1382. 将二叉搜索树变平衡 详细解析(Python版)本文针对 LeetCode 1382. 将二叉搜索树变平衡 题目,从题目分析、解题思路、代码实现、示例推演、进阶优化五个维度,进行详细拆解,确保新手能看懂、老手能复用。题目核心是将一棵任意二叉搜索树(BST)转化为平衡的二叉搜索树,且保证节点值与原树一致,适配 Python 刷题场景,附带完整可运行代码及实战踩坑点。一、题目核心解析1.1 题目要求给定一棵二叉搜索树(BST),返回一棵平衡的二叉搜索树,新树与原树节点值完全相同,若有多种构造方式,返回任意一种即可。平衡二叉树定义:树中每个节点的两棵子树高度差不超过 1(即 |左子树高度 - 右子树高度| ≤ 1)。1.2 关键前提(必看)二叉搜索树(BST)的核心特性:中序遍历序列是严格递增的,这是解题的核心突破口。平衡二叉树的核心需求:左右子树高度差不超过1,最容易构造平衡树的方式是「左右子树节点数量尽可能均匀」。约束条件:树节点数目 [1, 10⁴],节点值 [1, 10⁵],需保证代码时间复杂度不超过 O(n)(n 为节点数),避免超时。1.3 示例解读示例 1:输入 root = [1,null,2,null,3,null,4,null,null](原树为右斜树,高度为4,严重不平衡)输出:[2,1,3,null,null,null,4](平衡树,每个节点左右子树高度差≤1),也可输出 [3,1,4,null,2,null,null],两种均符合要求。示例 2:输入 root = [2,1,3](原树本身就是平衡BST),直接返回原树即可。二、解题思路(三步核心法)结合 BST 中序遍历递增的特性,构造平衡BST的最优思路的是「中序遍历取有序数组 + 分治构建平衡树」,三步即可完成,逻辑清晰且效率最优:步骤1:中序遍历原BST,获取有序节点值数组由于原树是 BST,中序遍历(左 → 根 → 右)会得到一个严格递增的节点值数组。这个数组的特性是:任意一个中间元素作为根节点,其左侧元素构成左子树,右侧元素构成右子树,能天然保证左右子树节点数量均匀,为构建平衡树奠定基础。步骤2:分治构建平衡BST对有序数组采用「分治思想」:取数组中间元素作为当前根节点(保证左右子树节点数相差不超过1,天然满足平衡条件)。中间元素左侧的子数组,递归构建左子树。中间元素右侧的子数组,递归构建右子树。递归终止条件:当子数组为空时,返回 None(无子节点);当子数组只有一个元素时,返回该元素作为叶子节点。步骤3:返回构建好的平衡BST根节点分治递归结束后,得到的根节点即为平衡后的二叉搜索树的根,且节点值与原树完全一致,满足题目要求。复杂度分析时间复杂度:O(n),中序遍历遍历所有节点(O(n)),分治构建树也遍历所有节点(O(n)),整体线性时间。空间复杂度:O(n),用于存储中序遍历的有序数组(O(n)),递归栈深度最坏为 O(log n)(平衡树),整体空间由数组主导。三、完整代码实现(严格遵循要求格式)代码严格按照题目要求的类和方法定义,附带详细注释,可直接复制到 LeetCode 运行,无需修改:# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution:defbalanceBST(self,root:/
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2516550.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!