您的位置:首页 > 理论基础 > 数据结构算法

NYOJ756 重建二叉树

2018-03-13 21:24 381 查看
题目描述: 给你一颗二叉树的后序序列和中序序列, 求它的前序序列; 样例输入: ACBFGED ABCDEFG样例输出: DBACEGF
分析: 先复习一下前序遍历, 中序遍历, 后序遍历的次序前序遍历:1.访问根节点。2.访问左子树。3.访问右子树
中序遍历:1.访问左子树。2.访问根节点。3.访问右子树
后序遍历:1.访问左子树。2.访问右子树。3.访问根节点
先用手工试算出这个前序序列
后序遍历: ACBFGED 中序遍历: ABCDEFG第一步: 由后序遍历的最后一个元素知道整棵树最初的根节点为D    

第二步:由中序序列知道左子树是{A,B,C}, 右子树是{E,F,G}重复一二两步,知道E是右子树的根节点,并存在右子树,没有左子树反复套用一二两步规则,最终可得到整颗树


既然知道手算是如何算的,算法实现起来就方便多了代码:#include<iostream>
#include<cstdio>
#include<cstring>
#include<malloc.h>
using namespace std;
struct node {
char data;
node *left, *right;
};
// 构造一颗树 
void CreatTree(char *last, char *middle, node *&t, int len) {
if (len == 0) {
t = NULL;
return;
}
char c = last[len - 1];//取出后序序列中最后一个节点 
int pos = 0;
while (c != middle[pos]) {//找出该节点在中序序列的位置 
pos++;
}
t = (node*)malloc(sizeof(node));
t->data = c;
CreatTree(last, middle, t->left, pos);
CreatTree(last + pos, middle + pos + 1, t->right, len - pos - 1);
}

// 打印前序序列 
void Print(node *t) {
if (t != NULL) {
cout << t->data;
Print(t->left);
Print(t->right);
}
}
int main() {
char last[100], middle[100];
while (scanf("%s%s", last, middle) != EOF) {
node *t = NULL;
CreatTree(last, middle, t, strlen(last));
Print(t);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 数据结构