1. 题目来源
2. 题目说明
3. 题目解析
方法一:中序遍历+二分建树+常规解法
题目很明确了,就是将 BST
树,转化为 AVL
树,并返回其任意一种转化形式即可。具体的各种旋转转化可参考博主的博文:[C++系列] 77. 详解AVL平衡二叉搜索树,在此不重复造轮子。思路如下:
- 利用
BST
树等一众搜索树中序遍历为有序序列的性质,得到所有节点的值,得到有序数组 - 每次将该数组的中间元素作为根节点,中间元素的左边当做根节点的左子树,同理可得到右子树
- 递归的二分建树这样一定是平衡的
参见代码如下:
// 执行用时 :132 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :45.7 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* 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 {
public:
vector<int> vt;
void dfs(TreeNode* root) {
if (root == nullptr) return;
dfs(root->left);
vt.push_back(root->val);
dfs(root->right);
}
TreeNode* build(int left, int right) {
if (left > right) return nullptr;
int mid = (left + right) / 2;
TreeNode* tmp = new TreeNode(vt[mid]);
tmp->left = build(left, mid - 1);
tmp->right = build(mid + 1, right);
return tmp;
}
TreeNode* balanceBST(TreeNode* root) {
if (root == nullptr) return nullptr;
dfs(root);
return build(0, vt.size() - 1);
}
};