0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么就能构造成二叉树呢?

算法与数据结构 来源:代码随想录 作者:代码随想录 2022-07-14 11:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

经常有录友问,二叉树的题目中输入用例,在ACM模式下应该怎么构造呢?

力扣上的题目,输入用例就给了一个数组,怎么就能构造成二叉树呢?

这次就给大家好好讲一讲!

就拿最近公众号上 二叉树的打卡题目来说:

538.把二叉搜索树转换为累加树

其输入用例,就是用一个数组来表述 二叉树,如下:

768cf948-0323-11ed-ba43-dac502259ad0.png

一直跟着公众号学算法的录友 应该知道,我在二叉树:构造二叉树登场!,已经讲过,只有 中序与后序 和 中序和前序 可以确定一颗唯一的二叉树。前序和后序是不能确定唯一的二叉树的

那么538.把二叉搜索树转换为累加树的示例中,为什么,一个序列(数组或者是字符串)就可以确定二叉树了呢?

很明显,是后台直接明确了构造规则。

再看一下 这个 输入序列 和 对应的二叉树。768cf948-0323-11ed-ba43-dac502259ad0.png

从二叉树 推导到 序列,大家可以发现这就是层序遍历。

但从序列 推导到 二叉树,很多同学就看不懂了,这得怎么转换呢。

我在关于二叉树,你该了解这些!已经详细讲过,二叉树可以有两种存储方式,一种是 链式存储,另一种是顺序存储。

链式存储,就是大家熟悉的二叉树,用指针指向左右孩子。

顺序存储,就是用一个数组来存二叉树,其方式如图所示:

76b93ed6-0323-11ed-ba43-dac502259ad0.png

那么此时大家是不是应该知道了,数组如何转化成 二叉树了。如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2

那么这里又有同学疑惑了,这些我都懂了,但我还是不知道 应该 怎么构造。

来,咱上代码。昨天晚上 速度敲了一遍实现代码。

具体过程看注释:

//根据数组构造二叉树
TreeNode*construct_binary_tree(constvector<int>&vec){
vectorvecTree(vec.size(),NULL);
TreeNode*root=NULL;
//把输入数值数组,先转化为二叉树节点数组
for(inti=0;i< vec.size(); i++) {
        TreeNode* node = NULL;
if(vec[i]!=-1)node=newTreeNode(vec[i]);//数组中用-1表示null
vecTree[i]=node;
if(i==0)root=node;
}
//遍历一遍,根据规则左右孩子赋值就可以了
//注意这里结束规则是i*2+2< vec.size(),避免空指针
for(inti=0;i*2+2< vec.size(); i++) {
        if(vecTree[i]!=NULL){
//线性存储转连式存储关键逻辑
vecTree[i]->left=vecTree[i*2+1];
vecTree[i]->right=vecTree[i*2+2];
}
}
returnroot;
}

这个函数最后返回的 指针就是 根节点的指针, 这就是 传入二叉树的格式了,也就是 力扣上的用例输入格式,如图:

76cd1ece-0323-11ed-ba43-dac502259ad0.png

也有不少同学在做ACM模式的题目,就经常疑惑:

  • 让我传入数值,我会!
  • 让我传入数组,我会!
  • 让我传入链表,我也会!
  • 让我传入二叉树,我懵了,啥?传入二叉树?二叉树怎么传?

其实传入二叉树,就是传入二叉树的根节点的指针,和传入链表都是一个逻辑。

这种现象主要就是大家对ACM模式过于陌生,说实话,ACM模式才真正的考察代码能力(注意不是算法能力),而 力扣的核心代码模式 总有一种 不够彻底的感觉。

所以,如果大家对ACM模式不够了解,一定要多去练习!

那么以上的代码,我们根据数组构造二叉树,接来下我们在 把 这个二叉树打印出来,看看是不是 我们输入的二叉树结构,这里就用到了层序遍历,我们在二叉树:层序遍历登场!中讲过。

完整测试代码如下:

#include
#include
#include
usingnamespacestd;

structTreeNode{
intval;
TreeNode*left;
TreeNode*right;
TreeNode(intx):val(x),left(NULL),right(NULL){}
};

//根据数组构造二叉树
TreeNode*construct_binary_tree(constvector<int>&vec){
vectorvecTree(vec.size(),NULL);
TreeNode*root=NULL;
for(inti=0;i< vec.size(); i++) {
        TreeNode* node = NULL;
if(vec[i]!=-1)node=newTreeNode(vec[i]);
vecTree[i]=node;
if(i==0)root=node;
}
for(inti=0;i*2+2< vec.size(); i++) {
        if(vecTree[i]!=NULL){
vecTree[i]->left=vecTree[i*2+1];
vecTree[i]->right=vecTree[i*2+2];
}
}
returnroot;
}

//层序打印打印二叉树
voidprint_binary_tree(TreeNode*root){
queueque;
if(root!=NULL)que.push(root);
vector<vector<int>>result;
while(!que.empty()){
intsize=que.size();
vector<int>vec;
for(inti=0;i< size; i++) {
            TreeNode* node = que.front();
            que.pop();
            if(node!=NULL){
vec.push_back(node->val);
que.push(node->left);
que.push(node->right);
}
//这里的处理逻辑是为了把null节点打印出来,用-1表示null
elsevec.push_back(-1);
}
result.push_back(vec);
}
for(inti=0;i< result.size(); i++) {
        for(intj=0;j< result[i].size(); j++) {
            cout<< result[i][j] << "";
}
cout<< endl;
}
}

intmain(){
//注意本代码没有考虑输入异常数据的情况
//用-1来表示null
vector<int>vec={4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8};
TreeNode*root=construct_binary_tree(vec);
print_binary_tree(root);
}

可以看出我们传入的数组是:{4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8} , 这里是用 -1 来表示null,

538.把二叉搜索树转换为累加树中的输入是一样的

768cf948-0323-11ed-ba43-dac502259ad0.png

这里可能又有同学疑惑,你这不一样啊,题目是null,你为啥用-1。

用-1 表示null为了方便举例,如果非要和 力扣输入一样一样的,就是简单的字符串处理,把null 替换为 -1 就行了。

在来看,测试代码输出的效果:

76ef3fae-0323-11ed-ba43-dac502259ad0.png

可以看出和 题目中输入用例 这个图 是一样一样的。只不过题目中图没有把 空节点 画出来而已。

7747e866-0323-11ed-ba43-dac502259ad0.png

大家可以拿我的代码去测试一下,跑一跑。

注意:我的测试代码,并没有处理输入异常的情况(例如输入空数组之类的),处理各种输入异常,大家可以自己去练练

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    13020
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27494

原文标题:不懂就问!

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    UniStore正式全面开放

    5月7日,宇科技正式宣布,全球首个人形机器人任务动作应用商店——宇UniStore官方共享应用平台即日起面向全球用户全面开放。用户可通过该平台开发和下载机器人应用,像安装手机App一样简单,无需任何底层编程能力。
    的头像 发表于 05-09 11:22 879次阅读

    详解芯片烧录设备的内部构造

    本文拆解烧录器,揭秘其内部构造:底板含多级隔离电源与屏蔽接口区;主控板作为核心,搭载高性能 MCU、存储芯片型号库;驱动板通过驱动芯片和可更换 Pin Card 适配不同芯片;自动化机型还有高精度机械执行机构;散热与屏蔽设计保障稳定。理解构造可助力故障排查与保养,文末邀读
    的头像 发表于 03-24 16:08 728次阅读

    科技,IPO申请获受理

    电子发烧友网综合报道 3月20日,上交所网站显示,宇科技股份有限公司科创板IPO申请已受理,成为又一家科创板IPO“预先审阅”落地项目。此次IPO,宇科技拟募资42.02亿元。   招股书显示
    的头像 发表于 03-20 18:33 4359次阅读
    宇<b class='flag-5'>树</b>科技,IPO申请获受理

    Linux设备到底是啥?一张图看懂硬件适配的「翻译官」

    你有没有想过:同一份 Linux 内核镜像,为啥能在不同型号的开发板上跑起来?比如一块 ARM 架构的开发板,今天换个显示屏、明天加个传感器,内核不用重新编译就能识别新硬件 —— 这背后,设备(Devicetree) 功不可没。
    的头像 发表于 02-09 17:01 1390次阅读
    Linux设备<b class='flag-5'>树</b>到底是啥?一张图看懂硬件适配的「翻译官」

    入门宇机器人开发:从SDK源码探索到实战操作

    机器人(Unitree)作为全球领先的四足机器人研发企业,其推出的unitree_sdk2是面向旗下 Go2、H1、B2 等系列机器人的第代软件开发工具包。该 SDK 提供了丰富的接口和示例代码,支持开发者快速实现机器人控制、状态获取、传感器数据处理等功能,是入门宇
    的头像 发表于 02-06 16:43 3543次阅读
    入门宇<b class='flag-5'>树</b>机器人开发:从SDK源码探索到实战操作

    TÜV莱茵与杭集团达成战略合作并颁发欧盟CE-MD符合性证书

    日前,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(简称"TÜV莱茵")与杭集团股份有限公司(简称"杭集团")签署了战略合作协议,标志着双方
    的头像 发表于 01-15 12:18 498次阅读

    无线倾角传感器在古监测中的应用:以科技守护活文物的结构安全

    无线倾角传感器在古监测中的应用:以科技守护活文物的结构安全
    的头像 发表于 01-09 11:38 824次阅读
    无线倾角传感器在古<b class='flag-5'>树</b>监测中的应用:以科技守护活文物的结构安全

    亿纬锂能与杭集团达成战略合作

    近日,亿纬锂能与杭集团2025年战略研讨会暨战略合作协议签约仪式在杭州举行。亿纬锂能副总裁、商用车电池产品线总裁江吉兵博士,亿纬锂能商用车电池产品线国内销售部总经理井振江,杭集团董事、副总经理兼
    的头像 发表于 01-04 18:18 1215次阅读

    通过优化代码来提高MCU运行效率

    选择时间复杂度低的算法。 根据访问模式选择数据结构。频繁查找用哈希表,有序数据用二叉树等。 查表法:对于复杂的数学计算(如sin, log),或者协议解析,预先计算好结果存于数组中,用空间换时间
    发表于 11-12 08:21

    请问rtt studio 的文件夹打红什么意思?

    rtt studio 的文件夹打红什么意思?而且文件夹里面实际是有文件的,但是浏览不出来。
    发表于 09-18 06:34

    科技,被起诉

    电子发烧友网综合报道 天眼查显示,近日,杭州宇科技股份有限公司(以下简称“宇科技”)新增1条开庭公告,原告为杭州露韦美日化有限公司(以下简称“露韦美日化”),案由为侵害发明专利权纠纷,该案将于8
    的头像 发表于 08-26 07:50 5283次阅读
    宇<b class='flag-5'>树</b>科技,被起诉

    亿纬锂能荣获杭集团2022-2024年度优秀供应商奖

    近日,亿纬锂能凭借卓越产品、可靠交付与优质服务荣获杭集团颁发的“2022-2024年度优秀供应商”奖。杭集团副总经理兼杭电器董事长金华曙、杭电器总经理兼杭博电机总经理李明辉出席
    的头像 发表于 07-15 09:00 1147次阅读

    一文读懂三相变压器的构造和工作原理

    与维护管理,也能让相关从业者和学者对其内在运行机制有更清晰的认识。那么,三相变压器究竟是如何构造的,又遵循怎样的工作原理?以下是三相变压器的构造及工作原理的详细介绍:
    的头像 发表于 07-10 15:19 2709次阅读
    一文读懂三相变压器的<b class='flag-5'>构造</b>和工作原理

    千方科技推出AI大模型公路构造物评定系统

    公路构造物(桥梁、隧道、涵洞等)检测评定是养护管理的核心环节,通过量化构造物的技术状况评定等级,可为养护资源分配决策提供技术支持。传统公路构造物技术状况评定面临“三座大山”:一是评定结果易受人
    的头像 发表于 07-09 15:54 1159次阅读

    看点:投资方:宇科技或于科创板IPO 美媒:亚马逊机器人数量接近人类员工 英伟达股价创新高

    给大家带来一些行业资讯: 投资方:宇科技或于科创板IPO 早在2025年的5月29日,宇科技就正式发布通知称,因公司发展需要,杭州宇科技有限公司即日起名称变更为“杭州宇科技股份
    的头像 发表于 07-04 15:08 955次阅读