educoder数据结构 树 第1关:由双遍历序列构造二叉树
这是题目
本关任务:实现 ConstructTree.cpp 里的TNode* InPreToTree(char *pa, char *ia, int p1, int p2, int i1, int i2)函数。
相关知识
给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。例如前序序列是ABDECFG,中序序列是DBEAFCG,那么这颗二叉树的结构如图 1 所示。
树结点结构定义为:
struct TNode{
char data;
struct TNode* left;
struct TNode* right;
};
编程要求
本关任务是实现 ConstructTree.cpp 里的TNode* InPreToTree(char *pa, char *ia, int p1, int p2, int i1, int i2)函数。
该函数的功能是由前序遍历序列和中序遍历序列构造二叉树。前序序列为pa[p1:p2],中序序列为ia[i1:i2],返回所构造的二叉树的根指针。
提示1:这是一个递归函数,在主程序中调用:
InPreToTree(pa,ia,0,n-1,0,n-1),其中n是序列长度。
提示2:由于在DeleteTree()中是使用delete删除一个树结点,所以在InPreToTree()需要使用new来申请结点空间。
//ConstructTree.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ConstructTree.h"
/*
InPreToTree(): 由前序遍历序列和中序遍历序列构造二叉树
前序序列为pa[p1:p2]
中序序列为ia[i1:i2]
返回所构造的二叉树的根指针
*/
TNode* InPreToTree(char *pa, char *ia, int p1, int p2, int i1, int i2)
{
//在begin和end之间添加你的代码
/********* begin **********/
/********* end ************/
}
void PrintPostTravel(TNode* t)
{
if(t==NULL) return;
if(t->left) PrintPostTravel(t->left);
if(t->right) PrintPostTravel(t->right);
printf("%c", t->data);
}
void DeleteTree(TNode* t)
{
if(t==NULL) return;
if(t->left) DeleteTree(t->left);
if(t->right) DeleteTree(t->right);
delete t;
}
测试说明
本关的测试过程如下:
平台编译 step1/Main.cpp ;
平台运行该可执行文件,并以标准输入方式提供测试输入;
平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
输入格式:
输入前序序列
输入中序序列
输出格式:
输出后序序列
以下是平台对 step1/Main.cpp 的测试样例:
样例输入
ABDECFG
DBEAFCG
样例输出
Post Travel Result:DEBFGCA
我的code
/*
InPreToTree(): 由前序遍历序列和中序遍历序列构造二叉树
前序序列为pa[p1:p2]
中序序列为ia[i1:i2]
返回所构造的二叉树的根指针
*/
TNode* InPreToTree(char *pa, char *ia, int p1, int p2, int i1, int i2)
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
//递归终止条件,下标范围出界
if(p2-p1<0){
return NULL;
}
if(i2-i1<0){
return NULL;
}
char curRoot=*pa;
int i=0;
//左子树有i个节点
while(*(ia+i)!=curRoot){
i++;
}
//左子树的中序遍历序列,下标范围是(i1,i1+i-1)
char *leftIa=ia;
//左子树的前序遍历序列,下标范围是(p1+1,p1+i)
char *leftPa=pa+1;
//右子树的中序遍历序列,下标范围是(i1+i+1,i2)
char *rightIa=ia+i1+i+1;
//右子树的前序遍历序列,下标范围是(p1+i+1,p2)
char *rightPa=pa+p1+i+1;
TNode *curNode = new TNode;
curNode->left = InPreToTree(leftPa,leftIa,0,i-1,0,i-1);
curNode->data = curRoot;
curNode->right = InPreToTree(rightPa,rightIa,0,p2-p1-i-1,0,i2-i1-i-1);
return curNode;
/******END******/
/*请不要修改[BEGIN,END]区域外的代码*/
}