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

数据结构实验之二叉树四:(先序中序)还原二叉树

2019-08-03 18:10 459 查看

数据结构实验之二叉树四:(先序中序)还原二叉树
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
Input

输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串。

Output

输出一个整数,即该二叉树的高度。
Sample Input

9
ABDFGHIEC
FDHGIBEAC

Sample Output

5

#include<cstdio>
#include<cstring>
#include<cstdlib>

using namespace std;

struct Tree
{
char data;
Tree *l, *r;///
};
char s[55], t[55];
Tree *creat(char *s, char *t, int n)
{
Tree *tree;
if(n == 0) return NULL;
tree = (Tree *)malloc(sizeof(Tree));
tree->data = s[0];//先序序列第一个字母即为树根
int i = 0;
while(s[0] != t[i]) i++;//在中序列中树根之前的为左子树
tree->l = creat(s + 1, t, i);
tree->r = creat(s + i + 1, t + i + 1, n - i - 1);return tree;///
}
int deepth(Tree *tree)
{
int dl, dr, ds;
if(!tree) return 0;//树为空,高度为0
else
{
dl = deepth(tree->l);//左子树高度
dr = deepth(tree->r);//右子树高度
ds = 1 + (dl > dr ? dl : dr);//取左右子树高度高的为树的高度
}
return ds;
}
int main()
{
int n;
Tree *tree;
while(scanf("%d\n", &n) != EOF)
{
scanf("%s %s", s, t);
tree = creat(s, t, n);
printf("%d\n", deepth(tree));
}
return 0;
}
tree->l = creat(s + 1, t, i);
tree->r = creat(s + i + 1, t + i + 1, n - i - 1);

另一种写法

上面的是mooc武汉大学数据结构
https://www.geek-share.com/detail/2640620541.html
解释:
一、前序+中序

  1. 根据前序序列的第一个元素建立根结点;
  2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
  3. 在前序序列中确定左右子树的前序序列;
  4. 由左子树的前序序列和中序序列建立左子树;
  5. 由右子树的前序序列和中序序列建立右子树。

如:已知一棵二叉树的先序遍历序列和中序遍历序列分别是abdgcefh、dgbaechf,求二叉树及后序遍历序列。

先序:a b d g c e f h —>a bdg cefh
0 1 2 3 4 5 6 7 0 s + 1
中序:dgbaechf---->dgb(左子树 a(跟) echf(右子树)

得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。

先序:bdg—>b dg

中序:dgb —>dg b

得出结论:b是左子树的根结点,b无右子树,有左子树。

先序:dg---->d g

中序:dg----->dg

得出结论:d是b左子树的根节点,d无左子树,g是d的右子树

然后对于a 的右子树类似可以推出

最后还原: a

b                                                 c

d                                                       e                                f

g                                                                      h

后序遍历:gdbehfca

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: