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

二叉树的创建和先/中/后序遍历等基本操作 二叉树的创建 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;
    
微波无源器件 功分器1 新型方波导双模无功功分器 本名证明了一种基于有着特定功能的(dedicated)T性匹配元件(散射件)的进化结点的新型波导双模两路功分器的可行性。这个散射件,有着面向三个部分的匹配部分,提供了等效功分并且朝着对应的输出端口传输矩形波导的两个TE10/TE01正交模式。所提出的设计紧凑,易于比例变化并且能够级联来获得。 阅读详情

相关推荐

2021 buaa 计组上机P0 logisim 3道课上考试题

每年题目都不一样,但看看往年题可以帮助查缺补漏 第一题:组合逻辑设计 4人(1个组长和3个组员)对议题进行投票表决。组长有一票否决权。如果组长一票否决,则议题被否决。如果组长正常投票(同意、反对或者弃权),则统计同意的人数和反对的人数。当同意人数大于反对人数,则议题通过,否则议题被否决。 请设计组合逻辑电路,实现这样子的一个投票表决器 同意 反对 弃权 一票否决 组长信号 00 01 10 组员信号 00 01与11 10 第2题 时序逻辑电路设计 设计一个Mealy型电路,若序列的

weixin_41892813的博客 3457

科研智能体平台搭建与实战:大模型如何驱动科研自动化

大模型技术的快速发展,正推动AI智能体从单纯对话工具向主动执行任务的科研伙伴演进。智能体的核心原理在于整合模型调用、工具使用、知识库检索与工作流编排,使其能够自主拆解目标、执行操作并迭代优化。在科研场景中,这一技术价值尤为突出:文献初筛、实验数据清洗、代码调试、结果汇总等高频重复劳动均可实现自动化,大幅释放研究者精力。从基础组件配置到多智能体协同,从平台选型到提示词调优,实际落地需要关注模型匹配、工具稳定性、记忆管理与人机校验机制。本文基于真实工程经验,系统梳理科研智能体平台的搭建路径、应用案例与高频问题排

weixin_32597009的博客 284

别再瞎调了!手把手教你搞定STM32步进电机PID速度环(附完整代码与比例系数详解)

本文详细解析了STM32步进电机PID速度环的完整实现过程,从算法输出到脉冲频率的转换链路,重点讲解了比例系数的确定方法及系统标定实验。通过完整的代码示例和调试技巧,帮助工程师解决实际应用中的常见问题,提升步进电机控制精度与稳定性。

weixin_28729331的博客 214

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6495

DeepSeek邮件管理全攻略

DeepSeek邮件助手是一款高效的邮件处理工具,提供智能分类、撰写、回复和任务自动化功能。通过API调用或多智能体系统,它能自动分类邮件意图、生成专业回复并优化邮件内容。核心功能包括智能过滤、会议安排和任务提醒,支持与主流邮箱服务集成。提供精准提示词模板,帮助用户快速生成得体邮件,提升工作效率。适合个人和企业使用,通过简单配置即可实现邮件处理自动化。

Genio_Wang的博客 180

基于STM32+华为云设计的智慧农业灌溉系统(2023升级版)(158)

本项目设计一种基于STM32的智慧农业监测系统。该系统能够检测空气温度、湿度、光强度和土壤湿度等关键指标,并自动调节浇水量,实现作物生长环境的精细化管理。同时,本项目还支持本地LCD屏幕数据显示和通过ESP8266上传数据到华为云物联网平台,同时搭建流媒体服务器实现摄像头远程监控。最重要的是,本项目将利用Qt开发Android手机APP,使用户可以远程查看监测情况,了解农作物生成情况。

1万+

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7548

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 191

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值