力扣108. 将有序数组转换为二叉搜索树

98 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

力扣108. 将有序数组转换为二叉搜索树

一、题目描述:

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

img

输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

img

示例 2:

img

输入: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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目其实就是把一个中序遍历的序列转换为二叉树,但是这个二叉树不是唯一的,题目要求高度平衡,那么我们就有几种解法:

    • 选择中间位置右边的数字作为根节点
    • 选择中间位置左边的数字作为根节点
    • 选择任意一个中间位置数字作为根节点

    其实选哪个都一样,但是为了熟悉一下随机数的使用,我们来用一用第三种方法吧。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的,可是我这用时和内存消耗击败的人也太少了吧~

    赶紧看看大佬们都用的什么解法吧~ 当然可能是rand()占用了部分时间和空间。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    这个解法就很牛逼!!!!

    必须拿出来给大家看一看~

     /**
      * 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);
 }

image.png

四、总结:

看了大佬的解法,我自愧不如啊,C语言看来我还有很长一条路要走啊!

学好C语言,刷遍力扣都不怕~