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

    浏览量

    12862
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

原文标题:不懂就问!

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

    科技,被起诉

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

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

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

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

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

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

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

    白话理解RCC时钟(可下载)

    时钟就像是单片机的“心脏”,单片机正常工作离不开时钟的支持,下图是我们单片机的时钟 ,它反映了单片机的时钟关系。我们来详细描述一下时钟的工作原理。寄存器上电后有一个复位值,大家看我画红线的这个
    发表于 03-27 13:50 0次下载

    机器人看点:宇科技王兴兴回上海母校 加速商业化落地 宇机器人手租赁火爆

    给大家带来一些机器人的消息: 宇科技王兴兴回上海母校 加速商业化落地 日前,宇科技创始人王兴兴在接受媒体专访时候,介绍了公司的H1人形机器人的技术亮点及行业前景,H1人形机器人是首款能原地后翻出
    的头像 发表于 02-25 11:26 1775次阅读

    求解答,设备问题

    请问,rk3588j要再提取一个USB3.0接口设备怎么改
    发表于 02-20 11:22

    探秘 5KP28A极管:独特构造如何实现高效电压抑制?

    探秘 5KP28A极管:独特构造如何实现高效电压抑制?
    的头像 发表于 02-08 13:41 724次阅读
    探秘 5KP28A<b class='flag-5'>二</b>极管:独特<b class='flag-5'>构造</b>如何实现高效电压抑制?

    科技在物联网方面

    科技在物联网领域有多方面的涉及和发展,以下是一些具体信息: 传感器技术合作 与传感器公司合作:宇科技与一些传感器技术公司有合作,例如奥比中光为宇机器狗提供激光雷达及结构光传感器,这些传感器
    发表于 02-04 06:48

    EE-32:语言扩展:内存存储类型、ASM和内联构造

    电子发烧友网站提供《EE-32:语言扩展:内存存储类型、ASM和内联构造.pdf》资料免费下载
    发表于 01-14 15:03 0次下载
    EE-32:语言扩展:内存存储类型、ASM和内联<b class='flag-5'>构造</b>

    ads1278在上电正常使用时偶尔也会造成电流过大温度过高的情况,具体可能是什么造成

    造成如上问题。 2.ads1278手册上有上电顺序要求,但是并没有说具体需要延迟多少时间,那么只要是上电的先后顺序满足就可以了吗。 3.ads1278在上电正常使用时偶尔也会造成电流过大温度过高的情况,具体可能是什么造成
    发表于 01-10 12:02

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的name和value。在设备中,可描述的信息包括:一、CPU的数量和类别;、内存基地址和大小;三、总线和桥;四、外设连接;五、中断控制器和中断使用情况;六、GPIO控制器和GPIO使用情况;七
    发表于 01-08 08:32

    飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的name和value。在设备中,可描述的信息包括:一、CPU的数量和类别;、内存基地址和大小;三、总线和桥;四、外设连接;五、中断控制器和中断使用情况;六、GPIO控制器和GPIO使用情况;七
    发表于 01-07 09:16