CONTENT
- 树的存储结构:
1.双亲表示
2.孩子链表表示
3.树的二叉链表(重点) - 树,森林与二叉树的转换(firstchild,nextsibling)
- 遍历
- 如何建树:转为二叉树利用二叉树序列来建树;直接对输入的父亲孩子对进行建树
#include "stdio.h"
#include "stdlib.h"
#define N 30
typedef struct node
{
char data;
struct node *fir,*sib,*pa;
}TR;
TR *createtree(char *pre,int *k);
int height(TR *T);
void preorder(TR *T);
void postorder(TR *T);
void layer(TR *T);
TR *deltree(TR *T);
void showtree(TR *T);
void getpa(TR *T);
void showpa(TR *T);
TR *findpa(TR *T,TR **pa,char data);
void allpath(TR *T,char *route,int top);
main()
{
char pre[]="ABE F C DGH I J ";
TR *T=NULL,*p,*pa;
char data;
int k=0;
T=createtree(pre,&k);
printf("\n树:\n");
if(!T)
printf("树为空\n");
else
showtree(T);
printf("\n\n");
printf("\n先序遍历:\n");
preorder(T);
printf("\n后序遍历:\n");
postorder(T);
printf("\n层次遍历:\n");
layer(T);
printf("\n树的高度=%d\n",height(T));
printf("\n\n请输入带查找的节点数据:");
scanf("%c",&data);
while(data!='#')
{
getchar();
pa=p=NULL;
p=findpa(T,&pa,data);
if(!p)
printf("%c不存在\n",data);
else
{
if(!pa)
printf("%c是根节点,没有父节点\n",data);
else
printf("%c的父节点是%c\n",data,pa->data);
}
printf("\n请输入带查找的节点数据:");
scanf("%c",&data);
}
printf("\n");
getpa(T);
showpa(T);
char route[N];
printf("输出所有到叶子节点的路径:\n");
allpath(T,route,-1);
T=deltree(T);
}
TR *createtree(char *pre,int *k)
{
TR *T;
if(pre[*k]==' ')
return NULL;
else
{
T=(TR *)malloc(sizeof(TR));
T->data=pre[*k];
(*k)++;
T->fir=createtree(pre,k);
(*k)++;
T->sib=createtree(pre,k);
return T;
}
}
int height(TR *T)
{
int h1,h2;
if(T)
{
h1=1+height(T->fir);
h2=height(T->sib);
return h1>h2?h1:h2;
}
else return 0;
}
void preorder(TR *T)
{
if(T)
{
printf("%c ",T->data);
preorder(T->fir);
preorder(T->sib);
}
}
void postorder(TR *T)
{
TR *t[N],*p=T;
int top=-1;
while(top>=0||p)
{
while(p)
{
top++;
t[top]=p;
p=p->fir;
}
p=t[top];
top--;
printf("%c ",p->data);
p=p->sib;
}
}
void layer(TR *T)
{
TR *p=T;
int front=-1,rear=-1;
TR *t[N];
t[++rear]=T;
printf("%c ",p->data);
while(rear!=front)
{
p=t[front+1]->fir;
while(p)
{
t[++rear]=p;
printf("%c ",p->data);
p=p->sib;
}
front++;
}
printf("\n");
}
TR *deltree(TR *T)
{
TR *p=T,*p2;
if(!T)
return NULL;
else
{
p=T->fir;
while(p)
{
p2=p->sib;
free(p);
p=p2;
}
free(T);
return NULL;
}
}
void showtree(TR *T)
{
TR *p;
if(T)
{
printf("%c",T->data);
p=T->fir;
if(p)
{
printf("(");
showtree(p);
p=p->sib;
while(p)
{
printf(",");
showtree(p);
p=p->sib;
}
printf(")");
}
}
}
TR *findpa(TR *T,TR **pa,char x)
{
TR *target=NULL,*p;
if(T)
{
if(T->data==x)
{ *pa=NULL;
return T;
}
else
{
p=T->fir;
while(p)
{ if(p->data==x)
{
*pa=T;
return p;
}
target=findpa(p,pa,x);
if(target) return target;
p=p->sib;
}
}
}
}
void getpa(TR *T)
{
TR *p;
if(T)
{
p=T->fir;
while(p)
{
getpa(p);
p->pa=T;
p=p->sib;
}
T->pa=NULL;
}
}
void showpa(TR *T)
{
if(T)
{
if(!(T->pa))
printf("%c---NULL\n",T->data);
else
printf("%c---%c\n",T->data,T->pa->data);
showpa(T->fir);
showpa(T->sib);
}
}
void allpath(TR *T,char *route,int top)
{ TR *p;
if(T)
{ route[++top]=T->data;
if(!T->fir)
{
int i;
for(i=0;i<=top;i++)
printf("%c ",route[i]);
printf("\n");
}
else
{
p=T->fir;
while(p)
{
allpath(p,route,top);
p=p->sib;
}
}
}
}