左旋
思路
所有节点插在右子树,这样就会造成失衡,此时平衡因子为flag=false,平衡因子为false,失衡.左旋
左旋里面传新旧根节点treeheigt()函数,得到最新的树高。
树高给balance()函数,判断新树是否失衡,失衡就继续左旋。
直到不失衡就结束左旋。
于是写了如下代码,层层修bug之后:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool balance(TreeNode* root)
{
int right_height=treeheight(root->right);
int left_height=treeheight(root->left);
if(left_height-right_height<=1 || right_height-left_height <1)
{
return true;
}
return false;
}
int treeheight(TreeNode* root)
{
int left_height=treeheight( root->left) ;
int right_height=treeheight( root->right) ;
return 1+max(left_height,right_height);
}
void leftrotate(TreeNode* root)
{
if(root==nullptr)return;
TreeNode* newroot=root->right;
root=newroot->left;
//如果新节点的左子树有节点
if(newroot->left)
{
if(root->val<newroot->left->val)
{
root=newroot->left->left;
}
else
{
root=newroot->left->right;
}
}
//更新树高
int newroot_height= treeheight(newroot);
int root_height= treeheight(root);
}
void creatnode(TreeNode* root,vector<int>& nums)
{
if(root==nullptr)return;
int i=0;
root->val=nums[i];
i++;
creatnode(root->right,nums);
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size()<=0)return NULL;
TreeNode* root;
// root->val=nums[0];
creatnode(root,nums);
int firstheight=nums.size();
bool flag=false;
while(flag!=true)
{
leftrotate(root);
balance(root);
}
return root;
}
};
二分法
先把给的数组的中间值作为整棵树的根节点,然后再把从左边找中间值作为左子树的根,右子树同理。遍历左右子树即生成平衡二叉树

class Solution {
public:
TreeNode* tarversal(vector<int>& nums,int left,int right)
{
//递归
//递归结束条件
if(left>right)return nullptr;
int mid=(left+right)/2;
TreeNode* root=new TreeNode(nums[mid]);
root->left=tarversal(nums,left,mid-1);
root->right=tarversal(nums,mid+1,right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
TreeNode* root= tarversal(nums,left,right);
return root;
}
};