二叉树的创建以及前序、中序、后序、层次遍历

二叉树的创建和先/中/后序遍历等基本操作 二叉树的创建 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; void CreateBiTree(BiTree* T) { char ch; ch = getchar(); if (ch == '#') *T = NULL; else { *T = (BiTNode*)malloc(sizeof(BiTNode)); if (NULL == *T).. 阅读详情

二叉树的创建

前序序列和中序序列创建二叉树

        我们都知道,二叉树的前序遍历规则和中序遍历规则。

        前序遍历规则为:访问根节点->前序遍历左子树->前序遍历右子树。

        中序遍历规则为:中序遍历左子树->访问根节点->中序遍历右子树。

        我们以下面的二叉树为例,看看,这两种遍历规则有什么联系:

        如图,是一颗二叉树,我们先写出 它的 前序序列和中序序列。

在这里插入图片描述
        根据二叉树的前序遍历规则,我们可以写出其前序序列为:{3,9,8,5,10,20,15,7}

        根据二叉树的中序遍历规则,我们可以写出其中序序列为: {8,9,10,5,20,3,15,7}

        此时,我们可以发现,前序序列中的每一个节点对应在中序序列中的所在的位置,其之前都是该节点的左子树包含的所有节点,其之后都是该节点的右子树包含的所有节点。

        举个例子:前序序列中 3 这个节点,其在中序序列中的下标为5,在下标5之前的 8、9、10、5、20这些节点,都是3这个节点的左子树所包含的全部节点,在下标5之后的15、7这些节点,都是3这个节点的右子树所包含的全部节点。

        所以,我们在创建二叉树的时候,就可以利用这个特征来创建。即前序序列中的节点都可以当做一棵二叉树的根节点,根据这个节点在中序序列中的位置,来确定这棵二叉树的左右子树。找到该二叉树的左右子树后,又分别以左右子树的基准,查找左右子树的左右子树的根节点。

在这里插入图片描述
        根据上述思路,我们先通过前序序列找到整个二叉树的根节点:3。

        紧接着,查找3在中序序列中的位置,找到为:pos = 5。

        于是我们就可以确定,整个二叉树的左子树的所有节点,都存在于:[is,pos-1]这个区域。右子树的所有节点都存在于:[pos+1,ie]这个区域。

        接着,我们去创建左子树的根节点,但是左子树的根节点去哪拿呢?我们刚才已经说过,前序遍历优先输出的是每一棵二叉树的根节点。但是我们又如何保证前序序列中哪一个区间的数据 是在左半部分,哪一个区间的数据 是在右半部分呢?

        此时,我们可以定义一个dist来确定左半部分和右半部分的数据。int dist = pos - is。我们可以通过这个差值,在前序序列中确定哪一段区间是属于左子树的,哪一段区间是属于右子树的。

        即:[ps,ps+dist]是下一次查找左子树根节点所在的区间(即左前序,就在这个左前序中查找下一棵二叉树的根节点)
               [is,is+dist-1](即左中序,用于确定下一棵二叉树的左半部分)

               [ps+dist+1,pe]是下一次查找右子树的根节点所在区间(即右前序)

               [is+dis+1,ie]是下一次查找的右中序(用于确定下一棵二叉树的右半部分)

        代码实现:

    public void createPI(int[]pre,int[]in){
   
   
        if (pre.length<1 || in.length <1 || pre==null || in==null || pre.length!=pre.length){
   
   
            return;
        }
        int n= pre.length;
        root = createPI(pre,0,n-1,in,0,n-1);
    }
    private BtNode createPI(int[]pre,int ps,int pe,int[]in,int is,int ie){
   
   
        BtNode s = null;
        if (pe-ps>=0){
   
   
            s = new BtNode(pre[ps]);
            int pos = findIn(in,is,ie,pre[ps]);
            if (pos==-1){
   
   
                return null;
            }
            int dist = pos-is;
            s.leftChild = createPI(pre,ps+1,ps+dist,in,is,is+dist-1);
            s.rightChild = createPI(pre,ps+dist+1,pe,in,is+dist+1,ie);
        }
        return s;
    }

    private int findIn(int[]in,int begin,int end,int val){
   
   
        int pos = -1;
        for (int i = begin; i <=end ; i++) {
   
   
            if (in[i] == val){
   
   
                pos = i;
                break;
            }
        }
        return pos;
    
Linux系统监控实战:夜莺监控+categraf采集器配置全流程(附常见问题排查) 本文详细介绍了在Linux系统中使用夜莺监控和categraf采集器进行系统监控的全流程配置,包括环境准备、核心配置文件(如config.toml和procstat.toml)详解、服务集成与验证、高级监控配置实战以及常见问题排查。通过实战案例和优化建议,帮助运维人员快速构建高效的监控体系。 阅读详情

相关推荐

Paraview:Python Calculator Filter

python calculator过滤器 from paraview.simple import * connection = servermanager.Connect('localhost',11111) er = servermanager.sources.EnSightreader(CaseFileName='/.../data.case') er.PointArrays = ['x_velocity','1','y_velocity','1','z_velocity','1','cp','1']

haimianjie2012的专栏 3495

图像去雾常见数据集

上述数据集涵盖了室内、室外、真实和合成等多种场景,可以满足不同研究需求。在选择数据集时,建议根据具体任务的应用场景和目标选择合适的数据集,例如真实雾天图像适合模型的实际应用验证,而合成数据则适合模型的快速迭代和训练。希望本文能为从事图像去雾研究的朋友提供一些帮助!

m0_68604571的博客 6334

逆向CarPlay协议时,除了USB主从切换,你还需要注意这3个关键点

本文深入探讨逆向CarPlay协议时的3个关键点,包括MFi协议背景、多通道协同工作机制和协议分析工具的高级过滤技巧。特别解析了USB主从切换后的复杂交互过程,帮助安全研究员和逆向工程师更好地理解CarPlay协议的核心机制与潜在安全研究切入点。

weixin_29164497的博客 381

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9402

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

【RT-DETR有效改进】为什么YOLO版本的RT-DETR训练模型不收敛精度差的问题

本文的内容同样为本专栏的前期预热文章,文章主要解释一下为什么有的人跑ultralytics仓库的RT-DETR精度很差,模型不收敛,mAP异常的情况。为了验证这一情况我也是跑了多个实验,从多个数据集出发,100-500的数据集我跑了大概5个数据集,1000的我跑了二个,2000的我跑了一个,4000的跑了一个,同时其中一些版本我也用了不同的batch_size来出发验证精度异常的情况。

Snu77的博客 9762

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1142

Vibe coding 氛围编程:编程就像聊天一样,低代码开发时代来了?

Vibe coding:编程就像聊天一样,低代码开发时代来了!

Code_流苏:在代码中寻诗意,在实践中觅真知 4803

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 树和二叉树
下一篇: 计算机网络概述
Colourful.
博客等级 码龄6年 13粉丝 73原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值