一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
力扣108. 将有序数组转换为二叉搜索树
一、题目描述:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums 按 严格递增 顺序排列
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目其实就是把一个中序遍历的序列转换为二叉树,但是这个二叉树不是唯一的,题目要求高度平衡,那么我们就有几种解法:
- 选择中间位置右边的数字作为根节点
- 选择中间位置左边的数字作为根节点
- 选择任意一个中间位置数字作为根节点
其实选哪个都一样,但是为了熟悉一下随机数的使用,我们来用一用第三种方法吧。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的,可是我这用时和内存消耗击败的人也太少了吧~
赶紧看看大佬们都用的什么解法吧~ 当然可能是rand()占用了部分时间和空间。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
这个解法就很牛逼!!!!
必须拿出来给大家看一看~
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ //方法一:递归法 //1,定位根节点 //2,根节点左边作为左支递归处理 //3,根节点右边作为右支递归处理 struct TreeNode* sortedArrayToBST(int* nums, int numsSize){ int iRoot = 0; struct TreeNode* pCurNode = NULL; //1,结束条件 if((NULL == nums) || (0 == numsSize)) return NULL; //2,初始化 pCurNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); // memset(pCurNode, 0x00, sizeof(struct TreeNode)); //3,定位根节点 iRoot = numsSize / 2; //4,递归处理左右支 pCurNode->val = nums[iRoot]; pCurNode->left = sortedArrayToBST(&nums[0], iRoot); pCurNode->right = sortedArrayToBST(&nums[iRoot + 1], numsSize - iRoot - 1); return pCurNode; } 作者:r0vHWU5AdJ 链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/chun-cdi-gui-fa-gou-zao-er-cha-sou-suo-shu-108jian/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* comb(int* nums,int left,int right){
if(left > right){
return NULL;
}
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
int index = (left + right + rand() % 2) / 2;
node->val = nums[index];
node->left = comb(nums,left,index-1);
node->right = comb(nums,index+1,right);
return node;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
return comb(nums,0,numsSize-1);
}
四、总结:
看了大佬的解法,我自愧不如啊,C语言看来我还有很长一条路要走啊!
学好C语言,刷遍力扣都不怕~