108. 将有序数组转换为二叉搜索树

101 阅读2分钟

左旋

思路

所有节点插在右子树,这样就会造成失衡,此时平衡因子为flag=false,平衡因子为false,失衡.左旋

左旋里面传新旧根节点treeheigt()函数,得到最新的树高。

树高给balance()函数,判断新树是否失衡,失衡就继续左旋。

直到不失衡就结束左旋。 image.png

于是写了如下代码,层层修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;
    }
};

image.png

二分法

先把给的数组的中间值作为整棵树的根节点,然后再把从左边找中间值作为左子树的根,右子树同理。遍历左右子树即生成平衡二叉树

![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8d23c95db9674002a576d9dc6c2ba2a3~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=2235&h=1225&s=261205&e=png&b=ffffff)

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;
    }
};