1、树的双亲表示法:
树的双亲表示法
2、
Status InitTree(PTree *T)
{
(*T).n=0;
return OK;
}
void DestroyTree()
{
}
typedef struct
{
int num;
TElemType name;
}QElemType;
#include"c3-2.h"
#include"bo3-2.c"
Status CreateTree(PTree *T)
{
linkQueue q;
QElemType p,qq;
int i=1,j,l;
char c[MAX_TREE_SIZE];
InitQueue(&q);
printf("请输入根结点(字符型,空格为空): ");
scanf("%c%*c",&(*T).nodes[0].data);
if((*T).nodes[0].data!=Nil)
{
(*T).nodes[0].parent=-1;
qq.name=(*T).nodes[0].data;
qq.num=0;
EnQueue(&q,qq);
while(iMAX_TREE_SIZE)
{
printf("结点数超过数组容量n");
exit(OVERFLOW);
}
(*T).n=i;
}
else
(*T).n=0;
return OK;
}
#define ClearTree InitTree
Status TreeEmpty(PTree T)
{
if(T.n)
return FALSE;
else
return TRUE;
}
int TreeDepth(PTree T)
{
int k,m,def,max=0;
for(k=0;k=0)
printf(" %c",Value(T,T.nodes[i].parent));
printf("n");
}
return OK;
}
Status InsertChild(PTree *T,TElemType p,int i,PTree c)
{
int j,k,l,f=1,n=0;
PTNode t;
if(!TreeEmpty(*T))
{
for(j=0;j<(*T).n;j++)
if((*T).nodes[j].data==p)
break;
l=j+1;
if(i>1)
{
for(k=j+1;k<(*T).n;k++)
if((*T).nodes[k].parent==j)
{
n++;
if(n==i-1)
break;
}
l=k+1;
}
if(l<(*T).n)
for(k=(*T).n-1;k>=l;k--)
{
(*T).nodes[k+c.n]=(*T).nodes[k];
if((*T).nodes[k].parent>=l)
(*T).nodes[k+c.n].parent+=c.n;
}
for(k=0;k(*T).nodes[j+1].parent)
{
t=(*T).nodes[j];
(*T).nodes[j]=(*T).nodes[j+1];
(*T).nodes[j+1]=t;
f=1;
for(k=j;k<(*T).n;k++)
if((*T).nodes[k].parent==j)
(*T).nodes[k].parent++;
else if((*T).nodes[k].parent==j+1)
(*T).nodes[k].parent--;
}
}
return OK;
}
else
return ERROR;
}
Status deleted[MAX_TREE_SIZE+1];
void DeleteChild(PTree *T,TElemType p,int i)
{
int j,k,n=0;
linkQueue q;
QElemType pq,qq;
for(j=0;j<=(*T).n;j++)
deleted[j]=0;
pq.name='a';
InitQueue(&q);
for(j=0;j<(*T).n;j++)
if((*T).nodes[j].data==p)
break;
for(k=j+1;k<(*T).n;k++)
{
if((*T).nodes[k].parent==j)
n++;
if(n==i)
break;
}
if(k<(*T).n)
{
n=0;
pq.num=k;
deleted[k]=1;
n++;
EnQueue(&q,pq);
while(!QueueEmpty(q))
{
DeQueue(&q,&qq);
for(j=qq.num+1;j<(*T).n;j++)
if((*T).nodes[j].parent==qq.num)
{
pq.num=j;
deleted[j]=1;
n++;
EnQueue(&q,pq);
}
}
for(j=0;j<(*T).n;j++)
if(deleted[j]==1)
{
for(k=j+1;k<=(*T).n;k++)
{
deleted[k-1]=deleted[k];
(*T).nodes[k-1]=(*T).nodes[k];
if((*T).nodes[k].parent>j)
(*T).nodes[k-1].parent--;
}
j--;
}
(*T).n-=n;
}
}
void TraverseTree(PTree T,void(*Visit)(TElemType))
{
int i;
for(i=0;i
3、
#define MAX_TREE_SIZE 100
typedef struct
{
TElemType data;
int parent;
} PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int n;
} PTree
4、
typedef char TElemType;
TElemType Nil=' ';
#include"c6-4.h"
#include"bo6-4.c"
void vi(TElemType c)
{
printf("%c ",c);
}
void main()
{
int i;
PTree T,p;
TElemType e,e1;
InitTree(&T);
printf("构造空树后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%dn",TreeEmpty(T),Root(T),TreeDepth(T));
CreateTree(&T);
printf("构造树T后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%dn",TreeEmpty(T),Root(T),TreeDepth(T));
printf("层序遍历树T:n");
TraverseTree(T,vi);
printf("请输入待修改的结点的值 新值: ");
scanf("%c%*c%c%*c",&e,&e1);
Assign(&T,e,e1);
printf("层序遍历修改后的树T:n");
TraverseTree(T,vi);
printf("%c的双亲是%c,长子是%c,下一个兄弟是%cn",e1,Parent(T,e1),LeftChild(T,e1),RightSibling(T,e1));
printf("建立树p:n");
InitTree(&p);
CreateTree(&p);
printf("层序遍历树p:n");
TraverseTree(p,vi);
printf("将树p插到树T中,请输入T中p的双亲结点 子树序号: ");
scanf("%c%d%*c",&e,&i);
InsertChild(&T,e,i,p);
Print(T);
printf("删除树T中结点e的第i棵子树,请输入e i: ");
scanf("%c%d",&e,&i);
DeleteChild(&T,e,i);
Print(T);
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!



