108. Convert Sorted Array to Binary Search Tree(C语言)
高度平衡二叉搜索树的构建
题目
Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree.
Example 1:
Input: nums = [-10,-3,0,5,9]
Output: [0,-3,9,-10,null,5]
Explanation: [0,-10,5,null,-3,null,9] is also accepted:
Example 2:
Input: nums = [1,3]
Output: [3,1]
Explanation: [1,null,3] and [3,1] are both height-balanced BSTs.
Constraints:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums is sorted in a strictly increasing order.
解答
递归解答
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void Tra(struct TreeNode *tree, int *nums, int l_point, int r_point)
{
int i = (l_point + r_point)/2;
tree->val = nums[i];
tree->left = NULL;
tree->right = NULL;
if(l_point <= i-1)
{
tree->left = (struct TreeNode *)malloc(sizeof(struct TreeNode));
Tra(tree->left, nums, l_point, i-1);
}
if(i+1 <= r_point)
{
tree->right = (struct TreeNode *)malloc(sizeof(struct TreeNode));
Tra(tree->right, nums, i+1, r_point);
}
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
struct TreeNode *ret;
ret = (struct TreeNode *)malloc(sizeof(struct TreeNode));
int l_point = 0;
int r_point = numsSize - 1;
Tra(ret, nums, l_point, r_point);
return ret;
}
总结
1、高度平衡二叉搜索树(AVLTree)
- 左右子树都是AVL树
- 左右子树高度之差(简称平衡因子)的绝对值不超过1
2、二分搜索树的重点在于“划分区间”
用l_point和r_point来标定一个区间,用i=(l_point+r_point)/2来划分
3、在构建树的时候,一定注意,先分配空间(malloc),再传根节点指针。