LeetCode 将有序数组转换为二叉搜索树

69 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

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

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

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

示例 1:

image.png

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

image.png

示例 2:

image.png

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

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 按 严格递增 顺序排列

二、思路分析:

二叉搜索树就是节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。

我们首先要找到根节点,根节点就是数组最中间的值,如果是奇数就取最中间,偶数我们这里选择取中间靠左的位置,直接(left+right)/2即可,然后左边调用leftmid,右边mid+1right,递归调用即可。

三、AC 代码:

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

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

    return node;

}

struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
    return helper(0,numsSize,nums);
}

四、参考:

一文读懂二叉搜索树(BST)、中序遍历;附Python代码讲解注释 - 将有序数组转换为二叉搜索树 - 力扣(LeetCode)