目录
一、题目描述
二、初次解答
三、官方解法
四、总结
一、题目描述
二、初次解答
1. 思路:由于数组nums是递增的,采用二分查找法来构造平衡二叉搜索树。首先,选择nums的中间结点作为根节点,然后将左部分的中间值作为左子树,将右部分的中间值作为右子树,以此类推。
2. 代码:
void constructTree(int start, int end, int* nums, struct TreeNode** root){ if(start > end){ *root=NULL; return; } int mid=(start+end)/2; *root=(struct TreeNode*)malloc(sizeof(struct TreeNode)); (*root)->val=nums[mid]; constructTree(start, mid-1, nums, &((*root)->left)); constructTree(mid+1, end, nums, &((*root)->right)); } struct TreeNode* sortedArrayToBST(int* nums, int numsSize) { struct TreeNode* target=NULL; constructTree(0, numsSize-1, nums, &target); return target; }
3. 优点:仅遍历一遍数组,时间复杂度为O(n)。
4. 缺点:采用了递归,空间复杂度为O(log n)。
三、官方解法
官方解法均类似,都是采用二分方式来构建平衡二叉搜索树,时间和空间复杂度都一样。
四、总结
将升序/降序的数组构建为平衡二叉搜索树,可以使用二分查找的方法来递归构建。