• Convert Sorted Array to Binary Search Tree


    Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

    首先我是要AVL树的创建过程进行操作,不过提交之后出现超时,但还是让我将AVL树的创建过程实现了一遍,记录一下:

    C++实现代码:

    #include<iostream>
    #include<new>
    #include<vector>
    #include<cmath>
    using namespace std;
    
    //Definition for binary tree
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    class Solution
    {
    public:
        TreeNode *sortedArrayToBST(vector<int> &num)
        {
            if(num.empty())
                return NULL;
            TreeNode *root=NULL;
            int i;
            for(i=0; i<(int)num.size(); i++)
                insert(root,num[i]);
            return root;
        }
        void insert(TreeNode *&root,int key)
        {int lhigh,rhigh;
            if(root==NULL)
            {
                root=new TreeNode(key);
                if(root==NULL)
                    return;
            }
            else if(key<root->val)
            {
                insert(root->left,key);
                lhigh=maxDepth(root->left);
                rhigh=maxDepth(root->right);
                if(abs(lhigh-rhigh)>1)
                {
                    if(key<root->left->val)
                        SingleRotateWithLeft(root);
                    else
                        DoubleRotateWithLeft(root);
                }
            }
            else
            {
                insert(root->right,key);
                lhigh=maxDepth(root->left);
                rhigh=maxDepth(root->right);
                if(abs(lhigh-rhigh)>1)
                {
                    if(key>root->right->val)
                        SingleRotateWithRight(root);
                    else
                        DoubleRotateWithLeft(root);
                }
            }
        }
        int maxDepth(TreeNode *root)
        {
            if(root)
            {
                if(root->left==NULL&&root->right==NULL)
                    return 1;
                int leftDepth=maxDepth(root->left);
                int rightDepth=maxDepth(root->right);
                return leftDepth>= rightDepth ?(leftDepth+1):(rightDepth+1);
            }
            return 0;
        }
        void SingleRotateWithLeft(TreeNode *&root)
        {
            TreeNode *l=root->left;
            root->left=l->right;
            l->right=root;
            root=l;
        }
        void SingleRotateWithRight(TreeNode *&root)
        {
            TreeNode *r=root->right;
            root->right=r->left;
            r->left=root;
            root=r;
        }
        void DoubleRotateWithLeft(TreeNode *&root)
        {
            SingleRotateWithRight(root->left);
            SingleRotateWithLeft(root);
        }
        void DoubleRotateWithRight(TreeNode *&root)
        {
            SingleRotateWithLeft(root->right);
            SingleRotateWithRight(root);
        }
        void inorder(TreeNode *root)
        {
            if(root)
            {
                inorder(root->left);
                cout<<root->val<<" ";
                inorder(root->right);
            }
        }
    };
    
    int main()
    {
        Solution s;
        TreeNode *root=NULL;
        vector<int> vec={1,2,3,4,5,6,7,8,9,10};
        root=s.sortedArrayToBST(vec);
        s.inorder(root);
        cout<<endl;
        cout<<s.maxDepth(root)<<endl;
    }

    运行结果:

    提交的代码:

    #include<iostream>
    #include<new>
    #include<vector>
    #include<cmath>
    using namespace std;
    
    //Definition for binary tree
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    class Solution
    {
    public:
        TreeNode *sortedArrayToBST(vector<int> &num)
        {
            if(num.empty())
                return NULL;//递归的退出条件,一定要写哦
            TreeNode *root=NULL;
            int left=0;
            int right=num.size()-1;
            int mid=(left+right)/2;
            root=new TreeNode(num[mid]);
            vector<int> l(mid);
            vector<int> r(right-mid);
            int i;
            for(i=0;i<mid;i++)
                l[i]=num[i];
            for(i=mid+1;i<(int)num.size();i++)
                r[i-mid-1]=num[i];
            root->left=sortedArrayToBST(l);
            root->right=sortedArrayToBST(r);
            return root;
        }
        int maxDepth(TreeNode *root)
        {
            if(root)
            {
                if(root->left==NULL&&root->right==NULL)
                    return 1;
                int leftDepth=maxDepth(root->left);
                int rightDepth=maxDepth(root->right);
                return leftDepth>= rightDepth ?(leftDepth+1):(rightDepth+1);
            }
            return 0;
        }
        TreeNode* SingleRotateWithLeft(TreeNode *&root)
        {
            TreeNode *l=root->left;
            root->left=l->right;
            l->right=root;
            return l;
        }
        TreeNode* SingleRotateWithRight(TreeNode *&root)
        {
            TreeNode *r=root->right;
            root->right=r->left;
            r->left=root;
            return r;
        }
        TreeNode* DoubleRotateWithLeft(TreeNode *&root)
        {
            SingleRotateWithRight(root->left);
            return SingleRotateWithLeft(root);
        }
        TreeNode* DoubleRotateWithRight(TreeNode *&root)
        {
            SingleRotateWithLeft(root->right);
            return SingleRotateWithRight(root);
        }
        void inorder(TreeNode *root)
        {
            if(root)
            {
                inorder(root->left);
                cout<<root->val<<" ";
                inorder(root->right);
            }
        }
    };
    
    int main()
    {
        Solution s;
        TreeNode *root=NULL;
        vector<int> vec={1,2,3,4,5,6,7,8,9,10};
        root=s.sortedArrayToBST(vec);
        s.inorder(root);
        cout<<endl;
        cout<<s.maxDepth(root)<<endl;
    }
  • 相关阅读:
    男人要知道的40条忠告
    利用xtraBackup实现不停master服务做主从同步
    MY SQL 知识
    房价与阶级
    SQL Server数据库级别触发器
    mysql 5.7开启并行复制
    SQL Server 查出未提交事务(长事务)SQL
    开源数据集
    telnet
    Zend Studio使用综述
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4114161.html
Copyright © 2020-2023  润新知