给定一个有序整数数组 元素各不相同且按升序排列 编写一个算法 创建一棵高度最小的二叉搜索树
示例:
给定有序数组: [-10,-3,0,5,9]
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树
0
/ \
-3 9
/ /
-10 5
确定最小高度二叉搜索树的根节点之后,其余的数字分别位于最小高度二叉搜索树的左子树和右子树中,左子树和右子树分别也是最小高度二叉搜索树,因此可以通过递归的方式创建最小高度二叉搜索树
递归的基准情形是最小高度二叉搜索树不包含任何数字,此时最小高度二叉搜索树为空 在给定中序遍历序列数组的情况下,每一个子树中的数字在数组中一定是连续的,因此可以通过数组下标范围确定子树包含的数字,下标范围记为 [left,right]对于整个中序遍历序列,下标范围从 left=0到right=nums.length−1当left>right\textit{left}>\textit{right}left>right 时,最小高度二叉搜索树为空
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode*MidTreeNode(int*nums,int left,int right)
{
if(left>right)
{
return NULL;//递归的时候会出现left>right的情况 此时会造成stackoverflow栈溢出的问题 数组会越界 所以这里需要判断一下数组是否越界
}
//中序遍历:选择midi中间数作为root根节点
int midi=(left+right)/2;
struct TreeNode*root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val=nums[midi];
root->left=MidTreeNode(nums,left,midi-1);
root->right=MidTreeNode(nums, midi+1,right);
return root;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
return MidTreeNode(nums,0,numsSize-1);
}