跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

LeetCode 1382. 将二叉搜索树变平衡:中序遍历与有序数组重建

LeetCode 1382 题要求将一棵可能高度不平衡的二叉搜索树转换为一棵高度平衡的二叉搜索树。解决方案首先通过中序遍历获取所有节点的升序值序列并存入数组,随后利用有序数组构建平衡树的经典策略,每次选择中间元素作为根节点递归构建左右子树。该方法确保左右子树高度差不超过 1,最终实现平衡。整体时间复杂度为 O(N),空间复杂度为 O(N)。

禅心发布于 2026/2/26更新于 2026/6/225 浏览

LeetCode 1382. 将二叉搜索树变平衡

Problem: 1382. 将二叉搜索树变平衡

1. 整体思路

核心问题

我们需要将一棵可能高度不平衡的二叉搜索树(BST),转换成一棵高度平衡的二叉搜索树。

算法逻辑

  1. 中序遍历 (In-order Traversal):
    • 二叉搜索树的特性:通过中序遍历(左 -> 根 -> 右)可以得到一个升序的节点值序列。
    • 我们将原 BST 的所有节点值按照中序遍历的顺序存入一个 List<Integer> 中。
    • 这一步将树结构转化为了有序数组结构,消除了原本的树结构信息。
  2. 有序数组转平衡 BST (Reconstruction):
    • 这是一个经典问题(LeetCode 108. 将有序数组转换为二叉搜索树)。
    • 策略:为了让生成的 BST 尽可能平衡,我们应该总是选择数组的中间元素作为根节点。
    • 这样,数组被均分为左右两半,左半部分构建左子树,右半部分构建右子树。
    • 这个过程递归进行,直到数组范围为空。
    • 由于每次都取中点,左右子树的高度差最多为 1,从而保证了结果是一棵高度平衡的 BST。

2. 完整代码

import java.util.ArrayList;
import java.util.List;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode balanceBST(TreeNode root) {
        // 1. 中序遍历获取升序数组
        List<Integer> nums = inorderTraversal(root);
        // 2. 将有序数组转换为平衡二叉搜索树
        return sortedArrayToBST(nums);
    }

    // 中序遍历辅助方法
    private List<Integer> inorderTraversal(TreeNode node) {
        List<Integer> ans = new ArrayList<>();
        dfs(ans, node);
        return ans;
    }

    
       {
         (node == ) {
            ;
        }
        dfs(ans, node.left);
        ans.add(node.val);
        dfs(ans, node.right);
    }

    
     TreeNode  {
        
         buildBST(nums, , nums.size());
    }

    
    
    
     TreeNode  {
        
         (left == right) {
             ;
        }
        
        
           (left + right) >>> ;
        
        
        
          (nums.get(m), buildBST(nums, left, m), buildBST(nums, m + , right));
    }
}
// DFS 实现中序遍历
private
void
dfs
(List<Integer> ans, TreeNode node)
if
null
return
// 重建平衡 BST 入口
private
sortedArrayToBST
(List<Integer> nums)
// 这里的 range 是 [left, right) 左闭右开区间
return
0
// 递归构建平衡 BST
// left: 当前处理范围的起始索引 (inclusive)
// right: 当前处理范围的结束索引 (exclusive)
private
buildBST
(List<Integer> nums, int left, int right)
// 递归终止条件:区间为空
if
return
null
// 取中间元素作为根节点
// >>> 1 是无符号右移,相当于除以 2,但在处理负数时更安全(虽然这里索引是非负的)
int
m
=
1
// 创建新节点,值为中间元素
// 递归构建左子树:范围 [left, m)
// 递归构建右子树:范围 [m + 1, right)
return
new
TreeNode
1

3. 时空复杂度

假设二叉树的节点总数为 N。

时间复杂度:O(N)

  1. 中序遍历:访问每个节点一次,耗时 O(N)。
  2. 重建 BST:
    • 构建过程本质上也是对每个节点访问一次(每次递归创建一个新节点)。
    • 总共有 N 个节点需要创建。
    • 虽然 buildBST 是递归调用的,但总的节点创建操作是线性的。
    • 耗时 O(N)。
  • 总计:O(N) + O(N) = O(N)。

空间复杂度:O(N)

  1. 有序列表 nums:我们需要一个长度为 N 的 ArrayList 来存储节点值,空间 O(N)。
  2. 递归栈空间:
    • 中序遍历时,最坏情况(斜树)栈深度为 N。
    • 重建 BST 时,树是平衡的,栈深度为 log N。
    • 取最大值,空间复杂度为 O(N)。
  • 结论:O(N)。

目录

  1. LeetCode 1382. 将二叉搜索树变平衡
  2. 1. 整体思路
  3. 核心问题
  4. 算法逻辑
  5. 2. 完整代码
  6. 3. 时空复杂度
  7. 时间复杂度:O(N)
  8. 空间复杂度:O(N)
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Arduino 6.5 寸轮毂电机智能跟随机器人底盘设计与实现
  • HTML input type 属性全解析与实战避坑指南
  • C++ 标准库 string 类基础详解
  • DeepSeek 各版本演进历程与核心差异分析
  • 后仿真 SDF 反标 Warning 描述与解决方案
  • Fooocus 部署实践:本地手动配置与云端一键启用对比
  • Eclipse 编写第一个 Java 程序 HelloWorld 全流程
  • Python 数据治理全攻略:从爬虫清洗到 NLP 情感分析
  • incbin:C/C++二进制文件嵌入工具使用指南
  • 基于 SSM 框架与 Vue 的 Web 在线投稿系统设计与实现
  • Web 前端基础知识点汇总
  • 基于 SpringBoot+Vue 的考编论坛网站管理系统设计与实现
  • 基于 Home Assistant 的海尔设备全屋智能集成方案
  • Elasticsearch 核心概念与 Java 客户端实战
  • Java 9 至 Java 25 语言演进与技术革新分析
  • CCF 大模型论坛北京会议:大模型技术进展与挑战探讨
  • 网络安全十大热门岗位盘点及职业发展建议
  • 算法实战:利用位运算解决消失的两个数字问题
  • nlohmann/json 详解:现代 C++ 的 JSON 处理方案
  • GitHub 仓库从零开始:上传、更新与维护指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online