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");
}
}
分析: 先复习一下前序遍历, 中序遍历, 后序遍历的次序前序遍历: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");
}
}
相关文章推荐
- nyoj 756 重建二叉树(总结)
- NYOJ 756 重建二叉树
- nyoj221 nyoj756 重建二叉树
- nyoj756重建二叉树
- NYOJ 题目756 重建二叉树
- NYOJ 756 重建二叉树【由二叉树的后序和中序建立二叉树并得先序】
- nyoj-756 重建二叉树
- nyoj-756-重建二叉树
- nyoj 756 重建二叉树
- NYOJ-756重建二叉树
- nyoj756 重建二叉树
- 重建二叉树NYOJ221题 && NYOJ756题
- NYOJ 756 重建二叉树
- NYOJ-756重建二叉树
- 南阳 oj 重建二叉树 题目756
- nyist oj 756 重建二叉树
- NYOJ221二叉树重建(已知先序和中序求后序)
- nyoj 1063 - 生活的烦恼 二叉树重建及遍历
- nyist oj 756 重建二叉树
- NYOJ221tree(重建二叉树)