已知二叉树的先序序列,判断结点u是否是结点v的子孙,是就输出v到u的路径长度,否则输出NO。假设结点个数少于50个。
输入格式:
输入共二行,第一行中给出先序序列,第二行给出两个顶点。*表示空树。
输出格式:
输出一个整数或NO。
输入样例1:
ABCDE*GF***
BE
输出样例1:
2
输入样例2:
ABCDE*GF***
CE
输出样例2:
NO
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef struct BiNode
{
TElemType data;
struct BiNode *lchild,*rchild;
} BiNode,*BiTree;
typedef struct
{
int data;
struct BiNode node;
} ElemType;
Status CreateTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='*')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
if(!T)
exit(OVERFLOW);
T->data=ch;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
return OK;
}
BiTree Jude(BiTree T,char x)
{
BiTree T1;
if(T)
{
if(T->data==x)
return T;
else
{
T1=Jude(T->lchild,x);
if(T1)
return T1;
else
return Jude(T->rchild,x);
}
}
return NULL;
}
int height(BiTree T)
{
int h1,h2;
if(T)
{
h1=height(T->lchild);
h2=height(T->rchild);
return h1>h2?h1+1:h2+1;
}
else
return 0;
}
int main()
{
BiTree T,T1,T2;
CreateTree(T);
getchar();//注意换行符
char a,b;
scanf("%c",&a);
scanf("%c",&b);
int h;
T1=Jude(T,a);
T2=Jude(T1,b);
if(T1&&T2)
{
h=height(T1)-height(T2);
printf("%d",h);
}
else
printf("NO\n");
return 0;
}