【牛客刷题-算法】NC11 将升序数组转化为平衡二叉搜索树

导读:本篇文章讲解 【牛客刷题-算法】NC11 将升序数组转化为平衡二叉搜索树,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

个人主页:清风莫追
系列专栏:牛客刷题——数据结构与算法
推荐一款面试、刷题神器牛客网:👉点击加入刷题大军👈


1.题目描述

描述
给定一个升序排序的数组,将其转化为平衡二叉搜索树(BST).

平衡二叉搜索树指树上每个节点 node 都满足左子树中所有节点的的值都小于 node 的值,右子树中所有节点的值都大于 node 的值,并且左右子树的节点数量之差不大于1

数据范围

100000

n

10000

100000≤n≤10000

100000n10000,数组中每个值满足

v

a

l

5000

∣val∣≤5000

val∣≤5000
进阶:空间复杂度

O

(

n

)

O

(

n

)

O(n)O(n)

O(n)O(n),时间复杂度

O

(

n

)

O

(

n

)

O(n)O(n)

O(n)O(n)

例如当输入的升序数组为

[

1

,

0

,

1

,

2

]

[-1,0,1,2]

[1,0,1,2]时,转化后的平衡二叉搜索树(BST)可以为

{

1

,

0

,

2

,

1

}

\{1,0,2,-1\}

{1,0,2,1},如下图所示:
在这里插入图片描述

或为

{

0

,

1

,

1

,

#

,

#

,

#

,

2

}

\{0,-1,1,\#,\#,\#,2\}

{0,1,1,#,#,#,2} ,如下图所示:
在这里插入图片描述

返回任意一种即可。

2.算法设计思路

我们只需根据数组参数构建出一颗相应的二叉树并返回根结点即可。首先我们要注意到:输入的数组是升序的

于是我们只要:

  1. 选择数组的中间元素作为根结点
  2. 以中间元素左边的剩余元素,构建出左子树
  3. 以中间元素右边的剩余元素,构建出右子树

便可以递归地构建出相应的平衡二叉树。

3.算法实现

注:这里并不是完整代码,而只是核心代码的模式

1)遇到的一些问题

在具体的实现时,还会碰到一些细节处理上的问题。例如:

  • 当需要用两个数组元素来构建一颗子树时,并不能再划分为左子树根结点右子树三个部分
  • 已给出的函数声明sortedArrayToBST(int* num, int numLen )的参数列表并不能满足我们递归的需求

还有一个愚蠢的bug卡了我好久,就是把e - f写成了f - e

2)具体代码

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num int整型一维数组 
 * @param numLen int num数组长度
 * @return TreeNode类
 */
struct TreeNode* create(int* num, int f, int e){
    struct TreeNode* root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    if(e - f == 0){
        root->val = num[f];  
        root->left = NULL;
        root->right = NULL;
    }
    else if(e - f == 1){
        root->val = num[f];  
        root->left = NULL;
        root->right = create(num, e, e);
    }
    else {
        int mid = (f + e) / 2;
        root->val = num[mid];  //num[mid] = 9;
        root->left = create(num, f, mid-1);
        root->right = create(num, mid+1, e);
    }
    return root;
}

struct TreeNode* sortedArrayToBST(int* num, int numLen ) {
    // write code here
    struct TreeNode* root = NULL;
    if(numLen == 0){
        return NULL;
    }
    root = create(num, 0, numLen-1);
    return root;
}

4.运行结果

成功通过!

在这里插入图片描述


结束语:

今天的分享就到这里啦,快来加入刷题大军叭!
👉点击开始刷题学习👈

在这里插入图片描述


感谢阅读

个人主页:清风莫追

CSDN话题挑战赛第2期
参赛话题:学习笔记

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114809.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!