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

牛客题霸 [将升序数组转化为平衡二叉搜索树]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;
    }
};
posted @ 2020-11-08 10:03  回归梦想  阅读(157)  评论(0编辑  收藏  举报