LC.1382 | 将二叉搜索树变平衡 | 树 | 中序转有序数组 + 分治重建(等价于 LC.108)

输入: 二叉搜索树根节点 root(可能极度不平衡)。

要求: 返回一棵平衡后的 BST,节点值集合与原树完全一致(顺序可变,结构可变)。

输出: 平衡 BST 的根节点 TreeNode*


思路:

这题本质就是把“已经是 BST 但形状很烂”的树,重建成“高度平衡”的形状。

关键等价转换:

BST 的中序遍历结果是递增有序数组。
先中序把所有值收集出来得到有序数组 nums,再用“取中点当根”的分治法重建平衡 BST。

步骤拆成两段:

  1. 中序遍历收集 inorderCollect

    • 左 -> 根 -> 右
    • 把每个 node->val push 到 nums
      得到严格递增序列。
  2. 分治重建平衡树 buildBalanced(nums, l, r)

    • mid 作为根
    • [l, mid-1] 构左子树
    • [mid+1, r] 构右子树
      这一步和 LC.108 有序数组转 BST 完全同构。

复杂度:

  • 时间复杂度:O(N)
    • 一次遍历收集 + 一次分治建树。
  • 空间复杂度:O(N)
    • 额外数组 nums 存 N 个值;递归栈 O(log N)(重建时)。

class Solution {
public:
    TreeNode* balanceBST(TreeNode* root) {
        vector<int> nums;

        inorderCollect(root, nums);

        return buildBalanced(nums, 0, (int)nums.size() - 1);
    }

private:
    void inorderCollect(TreeNode* node, vector<int>& nums) {
        if (node == nullptr) return;

        inorderCollect(node->left, nums);
        nums.push_back(node->val);
        inorderCollect(node->right, nums);
    }

    TreeNode* buildBalanced(const vector<int>& nums, int l, int r) {
        if (l > r) return nullptr;

        int mid = l + (r - l) / 2;
        TreeNode* root = new TreeNode(nums[mid]);

        root->left = buildBalanced(nums, l, mid - 1);
        root->right = buildBalanced(nums, mid + 1, r);

        return root;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值