1双亲表示法:
双亲表示法
取一块连续的内存空间,在存储每个结点的同时,各自都附加一个记录其父结点位置的变量。
在树结构中,除了树根外,每个结点都只有一个父结点(又叫“双亲结点”)
struct node{
int e;
int parent;
};
struct tree{
node a[100];
int size;
};
void init(tree *&root){
cout<<"请输入节点个数"<<endl;
int n;
cin>>n;
root->size=n;
cout<<"请输入节点及其双亲的下标"<<endl;
for(int i=0;i<n;i++){
int p,e;
cin>>e;
cin>>p;
root->a[i].e=e;
root->a[i].parent=p;
}
root->a[0].parent=-1;
}
void find(tree * root){
cout<<"请输入要查找的元素的序号"<<endl;
int i;
cin>>i;
printf(" %d 的父亲结点序号为 %d\n",root->a[i].e,root->a[i].parent);
}
树的孩子表示法:
将树中的每个结点的孩子结点排列成一个线性表,用链表存储起来。对于含有 n 个结点的树来说,就会有 n 个单链表,将 n 个单链表的头指针存储在一个线性表中,这样的表示方法就是孩子表示法。
struct childPtr{
int data;
childPtr * next;
};
struct node{
int data;
childPtr * first;
};
struct tree{
node a[100];
int n;
};
void init(tree * root){
cout<<"输入节点的数量:"<<endl;
int n;
cin>>n;
root->n=n;
for(int i=0;i<n;i++){
cout<<"请输入当前节点的值以及当前节点的孩子个数"<<endl;
int p;
int size;
cin>>p>>size;
root->a[i].data=p;
root->a[i].first=new childPtr;//这一步别忘了
childPtr * temp=root->a[i].first;
temp->next=NULL;
cout<<"请输入当前节点"<<p<<"的孩子数值"<<endl;
for(int j=0;j<size;j++){
childPtr *ptr=new childPtr;
ptr->next=NULL;
cout<<"请输入第"<<j+1<<"个孩子的值"<<endl;
int l;
cin>>l;
ptr->data=l;
temp->next=ptr;
temp=ptr;
}
}
}
void find(tree *root){
cout<<"请输入要查找的节点的父元素的值"<<endl;
int data;
cin>>data;
for(int i=0;i<root->n;i++){
if(root->a[i].data==data){
childPtr *p=root->a[i].first->next;
int j=0;
while(p){
cout<<"第"<<j+1<<"个孩子的值是:"<<p->data<<endl;
p=p->next;
}
break;
}
}
}