【头歌实训:由中序序列和后序序列构造二叉树】

头歌实训:由中序序列和后序序列构造二叉树

任务描述

本关任务要求采用中序遍历序列和后序遍历序列构造二叉树。

相关知识

给定一棵二叉树的中序遍历序列和后序遍历序列可以构造出这棵二叉树。例如后序序列是DEBFGCA,中序序列是DBEAFCG,那么这颗二叉树的结构如图1所示。

在这里插入图片描述

树结点结构定义为:

struct BTNode{
char data;
struct BTNode* lchild;
struct BTNode* rchild;
};

编程要求

本关任务是实现ConstructTree.cpp里的BTNode* InPostToTree(char *post, char *in, int n)。
该函数的功能是由后序遍历序列和中序遍历序列构造二叉树
后序序列为post[0:n-1]
中序序列为in[0:n-1]
返回所构造的二叉树的根指针
提示1:这是一个递归函数,在主程序中调用:
InPostToTree(post,in,n),其中n是序列长度。
提示2:由于在DeleteTree()中是使用delete删除一个树结点,所以在InPostToTree()需要使用new来申请结点空间。

//ConstructTree.cpp
#include “binary_tree.h”
/**
InPostToTree(): 由后序遍历序列和中序遍历序列构造二叉树
后序序列为post[0:n-1]
中序序列为in[0:n-1]
返回所构造的二叉树的根指针
/
BTNode
InPostToTree(char post, char in, int n);
{
//在begin和end之间添加你的代码
/
******* begin **********/

/********* end ************/

}
void PrintPreTravel(BTNode* t)
{
printf(“%c”, t->data);
if(tNULL) return;
if(t->lchild) PrintPreTravel(t->lchild);
if(t->rchild) PrintPreTravel(t->rchild);
}
void DeleteTree(BTNode* t)
{
if(t
NULL) return;
if(t->lchild) DeleteTree(t->lchild);
if(t->rchild) DeleteTree(t->rchild);
delete t;
}

测试说明

本关的测试过程如下:

平台编译step8/Main.cpp;
平台运行该可执行文件,并以标准输入方式提供测试输入;
平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
输入格式:

输入后序序列
输入中序序列

输出格式:

输出前序序列

以下是平台对step8/Main.cpp的测试样例:

样例输入

DEBFGCA
DBEAFCG

样例输出

Pre Travel Result:ABDECFG

开始你的任务吧,祝你成功!

源代码:

///////////////
#include "binary_tree.h"
///////////////


/**
	InPostToTree(): 由后序遍历序列和中序遍历序列构造二叉树
	后序序列为post[0:n-1]
	中序序列为in[0:n-1]
	返回所构造的二叉树的根指针
*/
BTNode* InPostToTree(char *post, char *in, int n)
{
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/
    if(n <= 0) return NULL;
    char *p, r;
    int k;
    BTNode *b = new BTNode;
    r = *(post + n - 1);
    b->data = r;
    for(p = in; p < in + n; p++) if(*p == r) break;
    k = p - in;
    b->lchild = InPostToTree(post, in, k);
    b->rchild = InPostToTree(post + k, p + 1, n - k - 1);
    return b;
	/******END******/
}
 
任务描述 本关任务:实现本实训所需头文件的基本函数。 相关知识 实验目的 掌握二叉树的动态链表存储结构及表示; 掌握二叉树的三种遍历算法(递归非递归两类); 运用二叉树三种遍历的方法求解有关问题。 二叉树是一种非常重要的结构。由于二叉树是树结构的基础,因此,掌握二叉树的性质、存储结构、运算及其实现显得尤为重要。由于二叉树的各子结构与整个结构具有相似的特性,因而其算法大多采用递归形式,这是一个难点,但也是非常重要的技术基础。因此,在理解掌握二叉树的相关性质、存储结构遍历算法的基础上,要求能熟练地运用于实际问题的求解。从实验的要求特点出发,偏重于二叉树的存储结构遍历运算及其应用,同时,借助于递归算法的运用熟练掌握递归技术。 实验任务 说明:为使实验程简洁直观,下面的部分实验程中的一些功能实现仍以调用库函数程"btrechar.h"中的函数的形式给出,并假设该库函数中定义了二叉树指针结点类型分别为bitrebnode,以及部分常用运算,例如构建二叉树、以某种方式显示二叉树等。各运算的名称较为直观,因而易于理解。 实验说明 下面重点讨论实验所涉及到的一些基础部分的实现方法。 二叉树的存储结构 在上机实现程时,存储结构及其构建是基础。如教科书中所述,存储结构可分为顺存储二叉链表存储两种形式,其中二叉链表存储形式的适用范围更大。因此,大多数情况下采用这种形式。本书所采用的结构形式与教科书类似,描述如下。 结点结构: 每个结点主要有三个字段:存放字符型数据的字段data,存放左右孩子指针的字段lchildrchild。类型描述如下; 将二叉链表中的指针类型定为bitre,结点类型定为bnode,类型描述如下: typedef struct bnode { char data; // 数据字段 struct bnode *lchild,*rchild; // 左右孩子指针 }; typedef bnode *bitre; 扩展二叉树 将所要建的二叉树中每个结点的空指针处再引出一个“孩子”结点,其值为一特定的值以标识其为空。例如,如果二叉树的结点值为字符型,则可以“.” 标识其为空,如图1图2所示。称这样处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树的先后序序列以及层次序列能唯一确定其原二叉树, 处理时只要将“.”作为空二叉树即可。 下面讨论采用扩展二叉树的先序列输入构建二叉树的方法。例如,为构造图1所示二叉树,则输入序列为ABD..E..CF..G..。 图1 原二叉树 图2 扩展二叉树 编程要求 在本关卡中,需要实现头文件"btrechar.h"的一些基本函数,各个函数的功能与参数说明如下: 函数: void load_bitre(bitre & t); 功能: 在函数内读取拓展二叉树的先遍历序列构建原二叉树; 返回值: 通过引用返回。 函数: void display_bitre(bitre & root); 功能: 输出二叉树的先遍历序列遍历序列; 格式: PreOrder: xxxxxxx InOrder: xxxxxxx 测试说明 平台会对你编写的代码进行测试: 输入数据: 一行字符串表示拓展二叉树的先遍历序列。 输出数据: 调用你编写的display_bitre函数的输出。 ``` 开始你的任务吧,祝你成功!#pragma once # include <bits/stdc++.h> using namespace std; namespace exa{ struct bnode { struct bnode * lchild, * rchild; char data; }; typedef bnode * bitre; //读取扩展二叉树的先序列来构建原二叉树 static void load_bitre(bitre & t) { } //输出二叉树的先遍历序列 //输出格式为: //PreOrder: xxxxxxx //InOrder: xxxxxxx static void display_bitre(bitre & root) { } }
最新发布
12-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值