Leetcode 108 Convert Sorted Array to Binary Search Tree 有序数组构造平衡二叉查找树

给定一个升序排列的数组,将其转换为高度平衡的二叉搜索树。解题策略是选择中间元素作为根节点,递归地用左侧元素构造左子树,用右侧元素构造右子树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题地址

https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/

题目描述

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
给出一个有序数组(递增),使用该数组构造一个平衡二叉查找树。

解题思路

动态规划问题。我们从待选范围内选取中间数字来构造根结点,然后该取比该数字小的所有数字来构造该根结点的左子树,然后取比该数字大的所有数字来构造该根结点的右子树。

需要注意的是,对于某组数据,其中间结点可能有多种选择策略,例如:

[0, 1, 2, 3]

我们既可以选择1也可以选择2来构造根结点:

   1              2
  / \     or     / \
 0 [2,3]      [0,1] 3

在这两种情况下,其结果都是符合题目要求的,这里,我们仅选择其中一种来作为解决方案。在验证我们构造的二叉树是否是平衡二叉查找树时,我们仅判定它是否符合平衡二叉查找树的定义,但不判定具体是哪一种(leetcode应该也是这样的检查策略)。

算法描述

  1. 计算中间节点n/2,构造根节点;
  2. 使用中间节点以左的n/2个节点,递归构造左子树;
  3. 使用中间节点以右的n/2个节点,递归构造右子树。

代码 C

/**
 * 根据有序(递增)序列生成平衡二叉查找树
 * input nums     : 递增序列
 * input numsSize : 递增序列的元素个树
 */
struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {
    struct TreeNode* sortedSeqToBST(int*, int, int);
    return sortedSeqToBST(nums, 0, numsSize - 1);
}

/**
 * 根据有序(递增)序列的某一子序列生成平衡二叉查找树
 * input nums  : 递增序列
 * input start : 子序列开始位置(包含)
 * input end : 子序列结束位置(包含)
 */
struct TreeNode* sortedSeqToBST(int* nums, int start, int end) {
    /* 如果开始位置大于结束位置,返回NULL */
    if (start > end) return NULL;

    /* 创建根节点 */
    struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));

    /* 计算中间位置的点
     * 这样可以保证左右子树的点的个数的差不大于1
     * 以满足题目构造平衡二叉树的要求 */
    int center = (start + end) / 2;

    /* 保存根节点的值 */
    node->val = *(nums + center);    

    /* 分别使用中间点以左和以右的子序列构造左右子树 */
    node->left = sortedSeqToBST(nums, start, center - 1);
    node->right = sortedSeqToBST(nums, center + 1, end);

    return node;

}

完整代码https://github.com/Orange1991/leetcode/blob/master/108/c/main.c

代码 CPP

class Solution {
public:
    /**
     * 根据有序(递增)序列生成平衡二叉查找树
     * input nums : 递增序列
     */
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return sortedSeqToBST(nums, 0, nums.size() - 1);
    }

private:
    /**
     * 根据有序(递增)序列的某一子序列生成平衡二叉查找树
     * input nums  : 递增序列
     * input start : 子序列开始位置(包含)
     * input end   : 子序列结束位置(包含)
     */
    TreeNode* sortedSeqToBST(vector<int>& nums, int start, int end) {
        /* 如果开始位置大于结束位置,返回NULL */
        if (start > end) return NULL;

        /* 计算中间位置的点
         * 这样可以保证左右子树的点的个数的差不大于1
         * 以满足题目构造平衡二叉树的要求 */
        int center = (start + end) / 2;

        /* 创建根节点 */
        /* 保存根节点的值 */
        TreeNode* node = new TreeNode(nums[center]);

        /* 分别使用中间点以左和以右的子序列构造左右子树 */
        node->left = sortedSeqToBST(nums, start, center - 1);
        node->right = sortedSeqToBST(nums, center + 1, end);

        return node;

    }
};

完整代码https://github.com/Orange1991/leetcode/blob/master/108/cpp/main.cpp

运行情况

LauguageStatusTime
cAccept4ms
cppAccept20ms

2015/6/3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值