求二叉树的深度
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树的深度。
输入
输入数据有多组,输入T组数据。每组数据包括两个长度小于<font face="\"Times" new="" roman,="" serif\"="" style="padding: 0px; margin: 0px;">50的字符串,第一个字符串表示二叉树的中序遍历,第二个表示二叉树的后序遍历。
输出
输出二叉树的深度。
示例输入
2 dbgeafc dgebfca lnixu linux
示例输出
4 3
注意,此题类似前中序列还原的,都要在中序列中查找,分离,然后一直递归,因此前后序列不能还原二叉树,中后和前中的区别就是后序列根节点在后面
#include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef struct node { char data; struct node *lchild,*rchild; } node, *tree; tree yuancreat(char *s,char *r,int n); int deep(tree t); int main() { tree tre; char s[60],r[60]; int a,l1; while(cin>>a) { tre=(tree)malloc(sizeof(node)); while(a--) { cin>>s; cin>>r; l1=strlen(r); tre=yuancreat(s,r,l1); cout<<deep(tre); cout<<endl; } } } tree yuancreat(char *s,char *r,int n) { tree t; char *p; if(n==0) return NULL;//终止的 t=(tree)malloc(sizeof(node)); if(!t) exit (0); t->data=r[n-1]; //取根节点进入树 for(p=s; p!='\0'; p++) { if(*p==r[n-1]) break;//查找根节点 } int ln=p-s;//遍历到中间根节点,左边的数值的个数 t->lchild=yuancreat(s,r,ln);//s-->r,为左子树 t->rchild=yuancreat(s+ln+1,p+1,n-ln-1);//整体右子树s+ln+1-->p+1 return t; } int deep(tree t) { int ld,rd; if(t==NULL) return 0; else { ld=deep(t->lchild); rd=deep(t->rchild); } if(ld>rd) return ld+1; else return rd+1; }