输入: 二叉搜索树根节点 root(可能极度不平衡)。
要求: 返回一棵平衡后的 BST,节点值集合与原树完全一致(顺序可变,结构可变)。
输出: 平衡 BST 的根节点 TreeNode*。
思路:
这题本质就是把“已经是 BST 但形状很烂”的树,重建成“高度平衡”的形状。
关键等价转换:
BST 的中序遍历结果是递增有序数组。
先中序把所有值收集出来得到有序数组nums,再用“取中点当根”的分治法重建平衡 BST。
步骤拆成两段:
-
中序遍历收集
inorderCollect- 左 -> 根 -> 右
- 把每个
node->valpush 到nums
得到严格递增序列。
-
分治重建平衡树
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;
}
};

被折叠的 条评论
为什么被折叠?



