每天一道LeetCode-20(将有序数组转换为二叉搜索树)

22 阅读2分钟

题目描述

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

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

示例 1:

输入: nums = [1,3]
输出: [3,1]
解释: [1,null,3][3,1] 都是高度平衡二叉搜索树。

分析

对于给定的nums数组,我们可以将数组最中间的元素作为我们的根节点,左边的数作为左子树,右边的数作为右子树,然后分别的左右两边的数进行上述操作,就可以实现平衡二叉树。以上是总的思路,接下来我们一步一步分析。

  1. 我们肯定需要进行递归操作,题目所给的函数参数不利于我们实现二叉树,自定义个函数fn,明确函数的返回类型,题目要求返回二叉树,即返回TreeNode* 类型的根节点,于是fn函数类型应该是struct TreeNode*,再明确函数的参数,我们是对题目给的nums数组进行左右两边分别递归,于是参数自然有nums,以及左右两个位置的起始值。
struct TreeNode* fn(int* nums,int left,int right){
    return ;
}
  1. 明确递归结束的条件,当left > right 时,表示该节点已经是叶子节点了,return NULL即可。
struct TreeNode* fn(int* nums,int left,int right){
    if(left>right) return NULL;
    return ;
}
  1. 首先定义一个mid=(left+right)/2,作为每次创建子树的根节点的值,再申请一个root空间,用来存放根节点信息,根节点定义完成,再对节点的左右子树分别递归调用,最后返回根节点root。

实现代码

struct TreeNode* fn(int* nums,int left,int right){
    if(left>right) return NULL;
    int mid = (left + right) / 2;
    struct TreeNode* root = (struct TreeNode*) malloc(sizeof (struct TreeNode));
    root->val = nums[mid];
    root->left = fn(nums,left,mid-1);
    root->right = fn(nums,mid+1,right);
    return root;
}

struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
    return fn(nums,0,numsSize-1);
}