知识点须知:
首先,我们应该明白什么是平衡二叉搜索树,我们从二叉树开始讲,先给出二叉树的定义:
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 。
简单来说,二叉树,顾名思义,即任何节点的子节点不大于2的树。接着我们给出二叉搜索树的定义:
二叉“搜索”树就是要满足一个额外的条件:所有左儿子节点的数字都比父亲节点数字小,所有右儿子的节点数字都比爸爸数字大。
我们最后给出平衡树的定义:
平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
由此我们可知平衡二叉搜索树也就是一颗满足根节点两边子树高度差不超过1,并且任何节点的左孩子的值小于本身的值,右节点的值大于本身的值的二叉树。
解题思路:
我们已知这个数组是有序的,那我们只需要每次对数组在中间进行拆分,我们可以得到中间的那个元素,这个元素左边的值都比他小,右边的元素的值都比他大,而且比他大的元素和比他小的元素数量差不超过1,故我们可以将这个元素设置为根节点的值,之后我们可以递归的来设置该节点的左孩子和右孩子。代码如下:
/**
* 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:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return recursion(nums,0,nums.size()-1);
}
TreeNode* recursion(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 = recursion(nums,left,mid-1);
root->right = recursion(nums,mid+1,right);
return root;
}
};