牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案

题目描述

给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST).

题解:

二叉搜索树的定义:
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉搜索树;
平衡的定义,就是指二叉树的子树高度之差不能超过1。
如果要从一个有序数组中选择一个元素作为根节点,我们应该选择中间元素作为根节点,因为这两离左右两端距离相近,高度差不会太大
选择了中间元素作为根结点后,剩下的元素分为两部分,可以看作是两个数组。剩下的元素在根结点左边的作为左子树,右边的作为右子树。
其实这就是前序遍历的步骤

代码:

/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */

class Solution {
   
public:
    /** * * @param num int整型vector * @return TreeNode类 */
    TreeNode* sortedArrayToBST(vector<int>& num) {
   
        // write code here
        if(!num.size()) return NULL;
        return preOrder(num,0,num.size()-1,num.size());
    }
    TreeNode* preOrder(vector<int>& num,int left,int right,int n){
   
     // if(left>right) return nullptr;
        if(left>right) return NULL;
        int mid=(right+left+1)/2;
        TreeNode* root=new TreeNode(num[mid]);
        root->left=preOrder(num,left,mid-1,n);
        root->right=preOrder(num,mid+1,right,n);
        return root;
    }
};