思路:
这道题我自己觉得是很重要的题,可以锻炼二叉树的遍历方法。首先我们得知道,当给二叉搜索树建立AVL树的时候,是可以直接选择中间的点开始建立的,这样左右两边的节点是差不多相等的(可能出现某边比某边多一个,但这都不影响AVL平衡的规则)
其次二叉树的遍历方式是有很多种的,需要我们去掌握的:递归,非递归,Morries遍历这三种。
这里的做法就是先把树按照中序遍历,得到中序数组,然后再创建AVL树。
代码:
/**
* 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:
void dfs(TreeNode* root){
if(root==NULL) return ;
dfs(root->left);
q.push_back(root->val);
dfs(root->right);
return ;
}
TreeNode* build(int left,int right){
int mid = (left+right) >> 1;
TreeNode* root = new TreeNode(q[mid]);
if(left<=mid-1){
root->left = build(left,mid-1);
}
if(mid+1<=right){
root->right = build(mid+1,right);
}
return root;
}
TreeNode* balanceBST(TreeNode* root) {
dfs(root);
return build(0,q.size()-1);
}
private:
vector<int> q;
};