https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
二叉排序树(二叉搜索树)或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
解题思路:二分法+递归。找到数组中点,将数组分为两个数组,再次寻找中点,不断递归。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* BuildTree(int left,int right,int*nums);
struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {
int left=0,right=numsSize-1,mid = (left+right)/2;
if(numsSize==0) return NULL;
else return BuildTree(left,right,nums);
}
struct TreeNode* BuildTree(int left,int right,int*nums){
int mid = (left+right)/2; //每次寻找中点,保证二叉有序树条件成立
struct TreeNode *p=NULL;
if(left>right) return NULL;
else{
p = (struct TreeNode*)malloc(sizeof(struct TreeNode));
p->val = nums[mid];
p->left = BuildTree(left,mid-1,nums); //递归调用函数,创建左子树右子树
p->right =BuildTree(mid+1,right,nums);
}
return p;
}