1382. 将二叉搜索树变平衡
题目给出一个二叉搜索树,要求输出平衡后的二叉树。
利用二叉搜索树的性质,中序遍历序列是一个有序序列。然后取中序序列的中间元素作为根结点,左侧为左子树,右侧为右子树,递归建立平衡二叉树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
void in_order(TreeNode* root, vector<int>& data){
if(root == NULL){
return;
}
in_order(root->left, data);
data.push_back(root->val);
in_order(root->right, data);
}
TreeNode* construct(vector<int> data, int l, int r){
if(l > r){
return NULL;
}
int mid = (l + r) / 2;
TreeNode* node = new TreeNode(data[mid]);
node->left = construct(data, l, mid - 1);
node->right = construct(data, mid + 1, r);
return node;
}
public:
TreeNode* balanceBST(TreeNode* root) {
if(root == NULL){
return NULL;
}
vector<int> data;
in_order(root, data);
int right = data.size() - 1;
TreeNode* ans = construct(data, 0, right);
return ans;
}
};