2022年6月30日leetcode每日一题打卡——108.将有序数组转换为二叉搜索树

一、题目描述与要求

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

题目描述

给你一个整数数组 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 <= 104
  • -104 <= nums[i] <= 104
  • nums 按 严格递增 顺序排列

二、解题思路

总的思路:

要根据给出的整数数组将其转换成一颗高度平衡的二叉搜索树也就是左右两个子树的高度差的绝对值不超过1。那么就需要左右子树的结点个数应当是相等或者相差为1,如此才能给使得这颗二叉树的高度平衡。对此我们可以选择二分查找的方法,设定左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素,中指针mid指向数组最中间的元素,如果中间元素有两个则选择左边的那个。以这个思路来将数组划成两个较为平均的部分,接着以中间元素为根结点,为根结点申请结点空间,接着对其进行赋值。接下来就是对左右子树进行建立,以数组的前半部分作为左子树的结点运用以上方法继续建立左子树,以数组的后半部分作为右子树的结点运用以上方法建立右子树。最后建立完成后返回二叉树。
注:结果可能会有多种,这里运用层次遍历来遍历所建立的二叉树,但是在建立二叉树的过程中选择作为根结点的元素不同所建成的二叉树也会不同,如果选择中间位置右边的元素为结点所建立成的二叉树也会有一定的区别。

具体步骤:

1、判断给定数组是否为空,为空则所要建立的二叉树也为空树
2、定义中指针mid,如果选择中间位置左边为根结点则mid=(left+right)/2,如果选择中间位置右边为根结点则mid=(left+right+1)/2。
3、为根结点赋值并且递归调用函数来建立左子树与右子树,同时注意函数参数中区间的范围,左子树应当是(left,mid-1),右子树应当是(mid+1,right)。
4、建立成功,以层次遍历的方式返回二叉树的遍历结果。

三、具体代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

struct TreeNode* build(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=build(nums,left,mid-1);//选定根节点之后根结点左边部分为左子树,继续调用build函数建立左子树
    root->right=build(nums,mid+1,right);//缩小范围,根结点的右边元素构成右子树,调用build函数建立右子树
    return root;//建立完成后返回建立成功的二叉树
}

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

猜你喜欢

转载自blog.csdn.net/m0_59800431/article/details/125532760