数据结构实验之二叉树四:(先序中序)还原二叉树
2018-08-23 15:23
183 查看
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
(http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3343.html)
#include<stdio.h> #include<stdlib.h> #include<string.h> /* 此题为二叉树部分遍历基础题,根据先序序列和中序序列来建立二叉树, 前序遍历序列的第一个节点就是根节点,并在中序序列中找到此节点,那么 中序序列的左边所有节点便是根节点的左子树部分,右边为右子树部分,因 此,可以用递归分而治之。*/ typedef struct node { char data; struct node *lchild,*rchild; }tree; //用typedef 为复杂的声明定义简单的别名, //即把结构体的名字给起名为 tree。 tree *creat(char *pre,char *in,int len) {/* 每个子树的先序序列的第一个节点为子树的根,向后移动子树的中序序列 ,依旧使用和上述方法一样的套路,找到中序序列中的根节点,便可分开 得到左右子树,因此可以使用递归。*/ tree *root; if(len<=0) return NULL;//或者 root=NULL; root= new tree;// 和root = (tree *)malloc(sizeof(tree));一样; root->data=*pre;//此为把先序序列的第一个节点指定 为当前子树的根; char *p;//可理解为移动下标或者指针。 for(p=in;p!=NULL;p++) { if(*p==*pre) break; } //这一步为在中序序列中查找到当前根节点。 int lon=p-in; //这就可以求出左子树节点的个数了; root->lchild=creat(pre+1,in,lon);//这个为创建左子树啊,递归,和参数里的意思一样。 root->rchild=creat(pre+1+lon,p+1,len-lon-1);//这一块要充分理解,因为我们要的是创建右子树的 //首地址,所以要计算好首地址所在的位置,以及剩余 //的序列长度为右子树部分。 return root;//日,提交了两次都WA,原来忘了返回 。。。。。bitch。 } int PostTreeDepth(tree *root ) { /*此为求二叉树深度的函数,递归定义如下:若根为空,则高度为0,若非空,就去求就好 ,而且求高度是基于后序的思想,不能用前序和中序那样的格式去写,因为高度未知。*/ int hl,hr,max; if(root!=NULL) { hl=PostTreeDepth(root->lchild);//求左子树高度; hr=PostTreeDepth(root->rchild);//求右子树高度; max = hl > hr ? hl : hr; return max + 1; //最终二叉树的高度为左右子树中较大的深度加1; } else return 0; } int main() { int n; tree *root; char s1[55],s2[55]; while(~scanf("%d",&n)) { scanf("%s",s1); scanf("%s",s2); //可以char *pre,*in; //让pre = s1; // in = s2; root=creat(s1,s2,n); printf("%d\n",PostTreeDepth(root)); } return 0; }
方法二: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node { char data; struct node *lchild,*rchild; }tree; tree *creat(char a[],char b[],int len) {/* 另一种通俗易懂的方法,改为用数组写,数组的名称就为 他的首地址,因此这个可以简单一些。*/ tree *root; if(len<=0) return NULL; root= new tree; root->data=a[0]; char *p; for(p=b;p!='\0';p++) { if(*p==a[0]) break; } int l=p-b; root->lchild=creat(a+1,b,l); root->rchild=creat(a+1+l,p+1,len-l-1); return root; } int PostTreeDepth(tree *root ) { int hl,hr,max; if(root!=NULL) { hl=PostTreeDepth(root->lchild); hr=PostTreeDepth(root->rchild); max = hl > hr ? hl : hr; return max + 1; } else return 0; } int main() { int n; tree *root; char s1[55],s2[55]; while(~scanf("%d",&n)) { scanf("%s",s1); scanf("%s",s2); root=creat(s1,s2,n); printf("%d\n",PostTreeDepth(root)); } return 0; }
相关文章推荐
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- SDUT-3343 数据结构实验之二叉树四:(先序中序)还原二叉树
- [SDUT](3343)数据结构实验之二叉树四:(先序中序)还原二叉树
- 3343 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- C语言 数据结构之二叉树 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- SDUT 3343 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:(先序中序)还原二叉树 oj
- 3343 数据结构实验之二叉树四:(先序中序)还原二叉树
- 数据结构实验之二叉树四:还原二叉树
- 数据结构实验之二叉树四:还原二叉树
- 数据结构实验之二叉树四:还原二叉树