题目地址:
https://leetcode.com/problems/balance-a-binary-search-tree/
给定一个二叉搜索树,要求返回其平衡的版本。
一个比较简单的方法是,先中序遍历,然后直接建一下BBST,建树过程可以递归地做,取中点做树根,然后递归建立左右子树。代码如下:
class Solution {
public:
TreeNode* balanceBST(TreeNode* root) {
vector<int> v;
dfs1(root, v);
for (auto x : v) cout << x << endl;
return dfs2(v, 0, v.size() - 1);
}
void dfs1(TreeNode* cur, vector<int>& v) {
if (!cur) return;
dfs1(cur->left, v);
v.push_back(cur->val);
dfs1(cur->right, v);
}
TreeNode* dfs2(vector<int>& v, int l, int r) {
if (l > r) return nullptr;
int mid = l + (r - l >> 1);
TreeNode* root = new TreeNode(v[mid], nullptr, nullptr);
root->left = dfs2(v, l, mid - 1), root->right = dfs2(v, mid + 1, r);
return root;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。