树的双亲表示法之求出任给一个节点所在的层数
/*
采用树的双亲表示法求出任给一个节点所在的层数
算法思想:
首先遍历整棵树,找到这个节点,然后根据其双亲域向上回溯,
直到某个节点的双亲域为-1
*/
#include<stdio.h>
#define maxsize 100
typedef struct PTNode
{
char data;
int parent;
}PTNode;//树的节点
typedef struct PTree
{
PTNode Tnode[maxsize];
int n;//树中有n个节点
}PTree;//树
PTree CreatePtree();
int Level(PTree ,char );
//建树
PTree CreatePtree()
{
int i,n;
int parentId;
char ch;
PTree newTree;
scanf("%d",&n);
getchar();
newTree.n=n;
for(i=0;i<n;i++)
{
scanf("%c %d",&ch,&parentId);
newTree.Tnode[i].data=ch;
newTree.Tnode[i].parent=parentId;
getchar();
}
return newTree;
}
int Level(PTree pt,char ch)
{
int i,j,level;
PTNode p;//p相当于工作指针
for(i=0;i<pt.n;i++)
{
if(pt.Tnode[i].data==ch)
{
j=i;
break;//找到待查节点跳出循环
}
}
p=pt.Tnode[j];
level=1;
while(p.parent!=-1)
{
level++;
p=pt.Tnode[p.parent];//向上回溯找其祖先节点
}
return level;
}
int main(void)
{
int level;
char ch;
PTree newTree=CreatePtree();
scanf("%c",&ch);
level=Level(newTree,ch);
printf("%c位于第%d层\n",ch,level);
return 0;
}
`