hnust 1802: 二叉树遍历2

hnust 1802: 二叉树遍历2

题目描述
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

拷贝下面的代码,完成相应的函数。

//给定前序遍历和中序遍历,求其后序遍历
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;typedef char TElemType;
//二叉树的二叉链表存储表示
typedef struct BiTNode {TElemType data;                      //结点数据域struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;//根据先序序列pre[pre_low..pre_low+len-1]和中序序列in[in_low..in_low+len-1]建树t
void BuildTree(BiTree& t, char pre[], int pre_low, char in[], int in_low, int len)
{/****在此下面完成代码************//*********************************/
}
// 后序遍历的递归算法
void PostOrderTraverse(BiTree t)
{/****在此下面完成代码************//*********************************/
}void DestroyBitree(BiTree& t)
{/****在此下面完成代码************//*********************************/
}int main()
{char pre[30], in[30];BiTree t = NULL;while(cin >> pre) {cin >> in;BuildTree(t, pre, 0, in, 0, strlen(in));PostOrderTraverse(t);DestroyBitree(t);cout << endl;}
}

输入
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C…最多26个结点。
输出
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
样例输入 Copy
ABC
CBA
ABCDEFG
DCBAEFG
样例输出 Copy
CBA
DCBGFEA

代码解析

这段C++代码实现了根据先序序列和中序序列构建二叉树,后序遍历该二叉树,并最终销毁二叉树的功能。

1. 数据结构定义

  • BiTNode:定义了二叉树的节点结构,包含数据域 data 和指向左右孩子的指针 lchild, rchild
  • BiTree:二叉树的类型定义,指向 BiTNode 的指针。

2. 函数 BuildTree

  • 作用:根据先序序列 pre 和中序序列 in 构建二叉树。
  • 输入参数:先序序列的起始索引 pre_low,中序序列的起始索引 in_low,序列长度 len
  • 过程:
    • 如果序列长度小于等于0,返回 NULL
    • 否则,创建一个新的节点,其数据为先序序列的第一个元素。
    • 在中序序列中找到根节点的位置。
    • 递归地使用先序序列的子序列和中序序列的相应子序列构建左子树和右子树。

3. 函数 PostOrderTraverse

  • 作用:后序遍历二叉树。
  • 过程:
    • 如果树为空,返回。
    • 否则,先递归遍历左子树,然后递归遍历右子树,最后访问根节点。

4. 函数 DestroyBitree

  • 作用:销毁二叉树,释放所有节点的内存。
  • 过程:
    • 如果树为空,返回。
    • 否则,递归地销毁左子树和右子树,然后释放当前节点的内存,并将指针设置为 NULL

5. 主函数 main

  • 使用 while 循环读取先序序列和中序序列。
  • 调用 BuildTree 函数构建二叉树。
  • 调用 PostOrderTraverse 函数进行后序遍历。
  • 调用 DestroyBitree 函数销毁二叉树。
  • 打印换行符,开始下一轮遍历。

解题过程分析

问题分析

在计算机科学中,二叉树是一种基本的数据结构,而根据先序序列和中序序列构建二叉树是二叉树问题中的一个经典问题。本题要求实现这一功能,并进行后序遍历。

构建二叉树

构建二叉树的关键在于理解先序序列和中序序列的特点:

  • 先序序列的第一个元素是树的根节点。
  • 在中序序列中,根节点左边的部分是左子树,右边的部分是右子树。

利用这些特点,我们可以递归地构建整棵树。

后序遍历

后序遍历是二叉树遍历的一种方式,其顺序是:先递归遍历左子树,然后递归遍历右子树,最后访问根节点。这种遍历方式有助于我们访问树中的所有节点。

销毁二叉树

由于二叉树的节点是通过动态内存分配创建的,因此在不需要二叉树时,需要手动释放每个节点占用的内存,以避免内存泄漏。

代码分解

  1. 数据结构定义:定义了二叉树节点的结构 BiTNode 和二叉树类型 BiTree
  2. 构建函数BuildTree 函数使用递归方法根据先序和中序序列构建二叉树。
  3. 遍历函数PostOrderTraverse 函数使用递归方法实现后序遍历。
  4. 销毁函数DestroyBitree 函数使用递归方法销毁二叉树,释放所有节点的内存。
  5. 主函数:在 main 函数中,使用循环读取输入,构建二叉树,进行遍历,然后销毁二叉树。

总结

本文通过一段C++代码,展示了如何根据先序序列和中序序列构建二叉树,以及如何进行后序遍历和销毁二叉树。这些操作是数据结构中的基本技能,对于理解和掌握二叉树的概念非常有帮助。

注意事项

  • 在读取输入时,要注意处理字符串的结束符。
  • 在构建二叉树时,确保正确处理空树的情况。
  • 在销毁二叉树时,要确保所有节点的内存都被正确释放。
  • 使用递归方法时,要注意避免栈溢出的风险,尤其是在处理大型数据结构时。

部分代码

//根据先序序列pre[pre_low..pre_low+len-1]和中序序列in[in_low..in_low+len-1]建树t
void BuildTree(BiTree& t, char pre[], int pre_low, char in[], int in_low, int len)
{/****在此下面完成代码************/if(len<=0)t=NULL;//长度为0,t就没有数据啦else{t=new BiTNode;t->data=pre[0];//先序的第一个是这一段的根char root=pre[0];//存根int i;for(i=0;i<len;i++){//从中序中找到这个根的位置iif(in[i]==root)break;}BuildTree(t->lchild,pre+1,0,in,0,i);//i位置左边的数值是这一段的左子树BuildTree(t->rchild,pre+i+1,0,in+i+1,0,len-(i+1));//右边是右子树}/*********************************/
}
// 后序遍历的递归算法
void PostOrderTraverse(BiTree t)
{/****在此下面完成代码************/if(!t)return;else{PostOrderTraverse(t->lchild);PostOrderTraverse(t->rchild);cout<<t->data;}/*********************************/
}
void DestroyBitree(BiTree& t)
{/****在此下面完成代码************/if(!t)return ;else{if(t->lchild)DestroyBitree(t->lchild);if(t->rchild)DestroyBitree(t->rchild);delete t;t=NULL;}/*********************************/
}

AC代码

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;typedef char TElemType;
//二叉树的二叉链表存储表示
typedef struct BiTNode {TElemType data;                      //结点数据域struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;//根据先序序列pre[pre_low..pre_low+len-1]和中序序列in[in_low..in_low+len-1]建树t
void BuildTree(BiTree& t, char pre[], int pre_low, char in[], int in_low, int len)
{/****在此下面完成代码************/if(len<=0)t=NULL;//长度为0,t就没有数据啦else{t=new BiTNode;t->data=pre[0];//先序的第一个是这一段的根char root=pre[0];//存根int i;for(i=0;i<len;i++){//从中序中找到这个根的位置iif(in[i]==root)break;}BuildTree(t->lchild,pre+1,0,in,0,i);//i位置左边的数值是这一段的左子树BuildTree(t->rchild,pre+i+1,0,in+i+1,0,len-(i+1));//右边是右子树}/*********************************/
}
// 后序遍历的递归算法
void PostOrderTraverse(BiTree t)
{/****在此下面完成代码************/if(!t)return;else{PostOrderTraverse(t->lchild);PostOrderTraverse(t->rchild);cout<<t->data;}/*********************************/
}void DestroyBitree(BiTree& t)
{/****在此下面完成代码************/if(!t)return ;else{if(t->lchild)DestroyBitree(t->lchild);if(t->rchild)DestroyBitree(t->rchild);delete t;t=NULL;}/*********************************/
}int main()
{char pre[30], in[30];BiTree t = NULL;while(cin >> pre) {cin >> in;BuildTree(t, pre, 0, in, 0, strlen(in));PostOrderTraverse(t);DestroyBitree(t);cout << endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

17:低功耗篇(PWR)---HAL库

一:PWR 1:简历 PWR&#xff08;Power Control&#xff09;电源控制 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到…

51单片机9(使用左移实现流水灯编程)

一、序言&#xff1a;下面我们来给大家介绍一下这个流水灯&#xff0c;流水灯如何来实现&#xff1f;我们依然使用这个工程来完成它。 1、那要使用实现这个流水灯&#xff0c;那我们只需要让D1到D8逐个的点亮&#xff0c;那同样要实现它足够的点亮&#xff0c;也会涉及到延时&…

使用requirements.txt文件安装cuda(GPU)版本的pytorch

使用requirements.txt文件安装cuda&#xff08;GPU&#xff09;版本的pytorch 问题描述解决方法 问题描述 使用requirements.txt可以轻松地帮助我们配置新环境&#xff0c;然而&#xff0c;当使用requirements.txt安装pytorch时有时会出现仅能安装cpu版本pytorch的情况。 举例…

从汇编层看64位程序运行——函数的调用和栈平衡

函数调用 不知道有没有人想过一个问题&#xff1a;A函数调用B函数&#xff0c;B函数是如何知道在调用结束后回到A函数中的&#xff1f; 比如下面的代码&#xff0c;main函数调用foo。当foo执行完毕&#xff0c;需要执行main函数的return 0语句。但是main和foo是割裂的&#x…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

一文清晰了解CSS——简单实例

首先一个小技巧&#xff1a; 一定要学会的vsCode格式化整理代码的快捷键&#xff0c;再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括&#xff1a; 类选择器&#xff1a;以.开头&#xff0c;用于选择具…

React Element介绍

React Element是React中的核心概念之一&#xff0c;它代表了React应用中的UI元素。React Element并不是真实的DOM节点&#xff0c;而是一个轻量级的、不可变的、描述性的对象&#xff0c;它包含了创建UI所需的类型&#xff08;type&#xff09;、属性&#xff08;props&#xf…

前端框架前置知识之Node.js:模块化、导入导出语法、包的概念、npm介绍

什么是模块化&#xff1f; 在Node.js中&#xff0c;每一个文件都被视为一个单独的模块 概念&#xff1a;项目是由很多个模块文件组成的 好处&#xff1a;提高代码复用性&#xff0c;按需加载&#xff0c;独立作用域 使用&#xff1a;需要标准语法导出和导入进行使用 导入导…

在pycharm 2023.2.1中运行由R语言编写的ipynb文件

在pycharm 2023.2.1中运行由R语言编写的ipynb文件 背景与目标&#xff1a; 项目中包含由R语言编写的ipynb文件&#xff0c;希望能在pycharm中运行该ipynb文件。 最终实现情况&#xff1a; 未能直接在pycharm中运行该ipynb文件&#xff0c;但是替代的实现方法有&#xff1a;…

自然语言处理(NLP)——法国工程师IMT联盟 期末考试题

1. 问题1 &#xff08;法语&#xff09;En langue arabe lcrasante majorit des mots sont forms par des combinaisons de racines et de schmes. Dans ce mcanisme... &#xff08;英语&#xff09;In Arabic language the vast majority&#xff08;十之八九&#xff09; of…

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…

在线图书销售管理系统设计

在线图书销售管理系统的设计是一个涉及多个模块和功能的复杂项目&#xff0c;它旨在提高图书销售的效率&#xff0c;优化库存管理&#xff0c;提升用户体验&#xff0c;以及提供数据分析支持。以下是系统设计的一些关键组成部分&#xff1a; 1. 需求分析 用户需求&#xff1a…

[综述笔记]Functional neuroimaging as a catalyst for integrated neuroscience

论文网址&#xff1a;Functional neuroimaging as a catalyst for integrated neuroscience | Nature 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔…

Stable Diffusion 使用

目录 背景 最简单用法 进阶用法 高手用法 safetensor 一、概述 二、主要特点 背景 Stable Diffusion 开源后&#xff0c;确实比较火&#xff0c;上次介绍了下 Stable Diffusion 最简单的concept。今天继续介绍下&#xff0c;以Liblib 为例&#xff0c;介绍下如何使用参…

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…

LLM上下文长度扩展方案:YaRN

文章目录 I. 前言II. NTK-by-partsIII. YaRNIV. Dynamic NTK 题目&#xff1a; YaRN: Efficient Context Window Extension of Large Language Models 论文地址&#xff1a; YaRN: Efficient Context Window Extension of Large Language Models I. 前言 在之前的两篇文章中分…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

【工具使用】adb下载和配置

【工具使用】adb下载和配置 一&#xff0c;简介二&#xff0c;操作步骤2.1 Bing搜索adb2.2 下载adb工具2.3 添加路径到环境变量 三&#xff0c;效果验证 一&#xff0c;简介 本文主要介绍如何下载adb并安装使用&#xff0c;供参考。 此时打开cmd&#xff0c;输入adb 会提示&am…