LeetCode—108. Convert Sorted Array to Binary Search Tree

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

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.


给定一个有序数组,求出它的AVL数(平衡二叉树)。

首先,要知道一些概念。

二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别是二叉排序树。

平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1。

那么思路是:

1. 找到“最中间”的位置取一个根结点:为了确保高度差绝对值小于等于 1,我们需要找到最中间的位置取根结点。

2. 以根结点为中心,划分从数组开始到根结点结束的左侧数组(根结点的左子树数据),以及从根结点开始到原数组结束为止的右侧数组(根结点的右子树数据)。

3. 重复第 1 步的操作,在左子树数组中找到了我们认为的“最中间”的位置 ;然后重复第 2 步的操作,将该左子树数组划分成了左右两个数组。

4. 一直这样重复下去,依次构造结点的左右子结点指针指向,直到所有的元素都被取完结束,此时也就构造出来了被转换成功的高度平衡的二叉搜索树了。


class Solution {

public:

    TreeNode* sortedArrayToBST(vector<int>& nums) {

        if(nums.size() == 0) return NULL;

        int mid = nums.size()/2;

        TreeNode *root = new TreeNode(nums[mid]);

        vector<int> leftnode = vector<int>(nums.begin(), nums.begin()+mid);

        vector<int> rightnode = vector<int>(nums.begin()+mid+1, nums.end());

        if(mid != 0){

            root->left = sortedArrayToBST(leftnode);

        }

        if(mid != nums.size()-1){

            root->right = sortedArrayToBST(rightnode);

        }

        return root;

    }

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容