[color=darkred] Add(node2 , 0 , node6); [/color]树的存储结构(2)--孩子兄弟表示法 (C 语言)2008-10-23 18:17注:树的这种存储方式,对于删除结点以及复制结点等的操作不方便。为了实现以文件操作方式来操作结点,在后面的文章“树的孩子兄弟双亲”里代码主要是如何删除结点和复制结点,以及剪切结点等等,而遍历等可能会采用非递归算法,而不是此处的递归算法。其他操作的算法和这里的一样。
//*******************CodeTest**********************************
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct Node //定义一个结点
{
char data; //存储结点的内容
Node *child; //存储该结点的所有孩子
Node *brother; //存储该结点的所有兄弟
};
//取 node 的孩子节点
void GetChild(Node *node)
{
printf("此结点的孩子结点是: ");
Node *q;
q = node;
if(q->child == NULL)
{
printf("No Child!");
return;
}
else
{
q = q->child;
printf("--%c--",q->data);
while(q->brother != NULL)
{
printf("--%c--",q->brother->data);
q = q->brother;
}
return;
}
}
//取 node 的右继兄弟节点
void GetBrother(Node *node)
{
printf("此结点的兄弟结点是: "); //没有后继兄弟,可能由前继兄弟
Node *p;
p = node;
if(p->brother == NULL)
{
printf("No Brother!"); //没有后继兄弟,可能由前继兄弟
}
while(p->brother != NULL)
{
printf("--%c--",p->brother->data);
p = p->brother;
}
return;
}
//添加结点
void Add(Node *node , int flag , Node *aNode)
{
Node *p;
p = node;
if(flag == 0) //添加该结点的孩子结点
{
if(p->child == NULL)
{
p->child = aNode;
return;
}
else
{
p = p->child;
while(p->brother != NULL)
{
p = p->brother;
}
p->brother = aNode;
return;
}
}
if(flag == 1) //添加该结点的兄弟结点
{
while(p->brother != NULL)
{
p = p->brother;
}
p->brother = aNode;
return;
}
}
//在 node 中搜索 aNode ,按前序搜索
void PreSearch(Node *node , Node *aNode)
{
if(node == NULL)
{
return;
}
if(node->data == aNode->data)
{
//将搜索到的元素输出
printf("--%c--",node->data);
}
else
{
//printf("--%c--",node->data);
PreSearch(node->child , aNode);
PreSearch(node->brother , aNode);
}
printf("he");
}
//在 node 中搜索 aNode ,按后序搜索
void PostSearch(Node *node , Node *aNode)
{
if(node == NULL)
{
return;
}
if(node->data == aNode->data)
{
//将搜索到的元素输出
printf("--%c--",node->data);
}
else
{
//printf("--%c--",node->data);
PostSearch(node->child , aNode);
PostSearch(node->brother , aNode);
}
printf("he");
}
//输出该结点的兄弟结点和孩子结点
void Print(Node *node)
{
printf("此结点的兄弟结点是: "); //没有后继兄弟,可能由前继兄弟
Node *p;
p = node;
if(p->brother == NULL)
{
printf("No Brother!"); //没有后继兄弟,可能由前继兄弟
}
while(p->brother != NULL)
{
printf("--%c--",p->brother->data);
p = p->brother;
}
printf("\n");
printf("此结点的孩子结点是: ");
Node *q;
q = node;
if(q->child == NULL)
{
printf("No Child!");
return;
}
else
{
q = q->child;
printf("--%c--",q->data);
while(q->brother != NULL)
{
printf("--%c--",q->brother->data);
q = q->brother;
}
return;
}
}
//前序遍历
void PreOrder(Node *node)
{
if(node == NULL)
{
return;
}
else
{
printf("--%c--",node->data);
PreOrder(node->child);
PreOrder(node->brother);
}
printf("he");
}
//后序遍历
void PostOrder(Node *node)
{
if(node == NULL)
{
return;
}
else
{
PostOrder(node->child);
printf("--%c--",node->data);
PostOrder(node->brother);
}
printf("he");
}
//删除某结点及其子孙结点,后序删除法
void Delete(Node *node)
{
//树的这种存储方法对于删除的算法要求比较复杂
//提示可以在孩子兄弟表示法的基础上添加一个指向双亲的
//指针来方便删除操作
//在后面的文章里我将单独以-----孩子兄弟双亲表示法-----来
//实现删除结点,复制结点等等操作
}
int main(void)
{
//根结点
Node *node1;
node1 = (Node*)malloc(sizeof(Node));
node1->data = 'A';
node1->brother = NULL;
node1->child = NULL;
Node *node2;
node2 = (Node*)malloc(sizeof(Node));
node2->data = 'B';
node2->brother = NULL; //置新添加结点的兄弟为空
node2->child = NULL; //置新添加结点的孩子为空
Node *node3;
node3 = (Node*)malloc(sizeof(Node));
node3->data = 'C';
node3->brother = NULL; //置新添加结点的兄弟为空
node3->child = NULL; //置新添加结点的孩子为空
Node *node4;
node4 = (Node*)malloc(sizeof(Node));
node4->data = 'D';
node4->brother = NULL; //置新添加结点的兄弟为空
node4->child = NULL; //置新添加结点的孩子为空
Node *node5;
node5 = (Node*)malloc(sizeof(Node));
node5->data = 'E';
node5->brother = NULL; //置新添加结点的兄弟为空
node5->child = NULL; //置新添加结点的孩子为空
Node *node6;
node6 = (Node*)malloc(sizeof(Node));
node6->data = 'F';
node6->brother = NULL; //置新添加结点的兄弟为空
node6->child = NULL; //置新添加结点的孩子为空
Node *node7;
node7 = (Node*)malloc(sizeof(Node));
node7->data = 'G';
node7->brother = NULL; //置新添加结点的兄弟为空
node7->child = NULL; //置新添加结点的孩子为空
Node *node8;
node8 = (Node*)malloc(sizeof(Node));
node8->data = 'H';
node8->brother = NULL; //置新添加结点的兄弟为空
node8->child = NULL; //置新添加结点的孩子为空
Node *node9;
node9 = (Node*)malloc(sizeof(Node));
node9->data = 'I';
node9->brother = NULL; //置新添加结点的兄弟为空
node9->child = NULL; //置新添加结点的孩子为空
//node1 的孩子是 node2 , node3
Add(node1 , 0 , node2);
Add(node1 , 0 , node3);
//node2 的孩子是 node4 , node5 , node6
Add(node2 , 0 , node4);
Add(node2 , 0 , node5);
Add(node2 , 0 , node6);
//node3 的孩子是 node7 , node8
Add(node3 , 0 , node7);
Add(node3 , 0 , node8);
//node5 的孩子是 node9
Add(node5 , 0 , node9);
printf("\n------------------------------------------\n");
//前序遍历
PreOrder(node1);
printf("\n------------------------------------------\n");
//后序遍历
PostOrder(node1);
printf("\n------------------------------------------\n");
return 0;
}
//*******************EndCode***********************************
//*******************CodeTest**********************************
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct Node //定义一个结点
{
char data; //存储结点的内容
Node *child; //存储该结点的所有孩子
Node *brother; //存储该结点的所有兄弟
};
//取 node 的孩子节点
void GetChild(Node *node)
{
printf("此结点的孩子结点是: ");
Node *q;
q = node;
if(q->child == NULL)
{
printf("No Child!");
return;
}
else
{
q = q->child;
printf("--%c--",q->data);
while(q->brother != NULL)
{
printf("--%c--",q->brother->data);
q = q->brother;
}
return;
}
}
//取 node 的右继兄弟节点
void GetBrother(Node *node)
{
printf("此结点的兄弟结点是: "); //没有后继兄弟,可能由前继兄弟
Node *p;
p = node;
if(p->brother == NULL)
{
printf("No Brother!"); //没有后继兄弟,可能由前继兄弟
}
while(p->brother != NULL)
{
printf("--%c--",p->brother->data);
p = p->brother;
}
return;
}
//添加结点
void Add(Node *node , int flag , Node *aNode)
{
Node *p;
p = node;
if(flag == 0) //添加该结点的孩子结点
{
if(p->child == NULL)
{
p->child = aNode;
return;
}
else
{
p = p->child;
while(p->brother != NULL)
{
p = p->brother;
}
p->brother = aNode;
return;
}
}
if(flag == 1) //添加该结点的兄弟结点
{
while(p->brother != NULL)
{
p = p->brother;
}
p->brother = aNode;
return;
}
}
//在 node 中搜索 aNode ,按前序搜索
void PreSearch(Node *node , Node *aNode)
{
if(node == NULL)
{
return;
}
if(node->data == aNode->data)
{
//将搜索到的元素输出
printf("--%c--",node->data);
}
else
{
//printf("--%c--",node->data);
PreSearch(node->child , aNode);
PreSearch(node->brother , aNode);
}
printf("he");
}
//在 node 中搜索 aNode ,按后序搜索
void PostSearch(Node *node , Node *aNode)
{
if(node == NULL)
{
return;
}
if(node->data == aNode->data)
{
//将搜索到的元素输出
printf("--%c--",node->data);
}
else
{
//printf("--%c--",node->data);
PostSearch(node->child , aNode);
PostSearch(node->brother , aNode);
}
printf("he");
}
//输出该结点的兄弟结点和孩子结点
void Print(Node *node)
{
printf("此结点的兄弟结点是: "); //没有后继兄弟,可能由前继兄弟
Node *p;
p = node;
if(p->brother == NULL)
{
printf("No Brother!"); //没有后继兄弟,可能由前继兄弟
}
while(p->brother != NULL)
{
printf("--%c--",p->brother->data);
p = p->brother;
}
printf("\n");
printf("此结点的孩子结点是: ");
Node *q;
q = node;
if(q->child == NULL)
{
printf("No Child!");
return;
}
else
{
q = q->child;
printf("--%c--",q->data);
while(q->brother != NULL)
{
printf("--%c--",q->brother->data);
q = q->brother;
}
return;
}
}
//前序遍历
void PreOrder(Node *node)
{
if(node == NULL)
{
return;
}
else
{
printf("--%c--",node->data);
PreOrder(node->child);
PreOrder(node->brother);
}
printf("he");
}
//后序遍历
void PostOrder(Node *node)
{
if(node == NULL)
{
return;
}
else
{
PostOrder(node->child);
printf("--%c--",node->data);
PostOrder(node->brother);
}
printf("he");
}
//删除某结点及其子孙结点,后序删除法
void Delete(Node *node)
{
//树的这种存储方法对于删除的算法要求比较复杂
//提示可以在孩子兄弟表示法的基础上添加一个指向双亲的
//指针来方便删除操作
//在后面的文章里我将单独以-----孩子兄弟双亲表示法-----来
//实现删除结点,复制结点等等操作
}
int main(void)
{
//根结点
Node *node1;
node1 = (Node*)malloc(sizeof(Node));
node1->data = 'A';
node1->brother = NULL;
node1->child = NULL;
Node *node2;
node2 = (Node*)malloc(sizeof(Node));
node2->data = 'B';
node2->brother = NULL; //置新添加结点的兄弟为空
node2->child = NULL; //置新添加结点的孩子为空
Node *node3;
node3 = (Node*)malloc(sizeof(Node));
node3->data = 'C';
node3->brother = NULL; //置新添加结点的兄弟为空
node3->child = NULL; //置新添加结点的孩子为空
Node *node4;
node4 = (Node*)malloc(sizeof(Node));
node4->data = 'D';
node4->brother = NULL; //置新添加结点的兄弟为空
node4->child = NULL; //置新添加结点的孩子为空
Node *node5;
node5 = (Node*)malloc(sizeof(Node));
node5->data = 'E';
node5->brother = NULL; //置新添加结点的兄弟为空
node5->child = NULL; //置新添加结点的孩子为空
Node *node6;
node6 = (Node*)malloc(sizeof(Node));
node6->data = 'F';
node6->brother = NULL; //置新添加结点的兄弟为空
node6->child = NULL; //置新添加结点的孩子为空
Node *node7;
node7 = (Node*)malloc(sizeof(Node));
node7->data = 'G';
node7->brother = NULL; //置新添加结点的兄弟为空
node7->child = NULL; //置新添加结点的孩子为空
Node *node8;
node8 = (Node*)malloc(sizeof(Node));
node8->data = 'H';
node8->brother = NULL; //置新添加结点的兄弟为空
node8->child = NULL; //置新添加结点的孩子为空
Node *node9;
node9 = (Node*)malloc(sizeof(Node));
node9->data = 'I';
node9->brother = NULL; //置新添加结点的兄弟为空
node9->child = NULL; //置新添加结点的孩子为空
//node1 的孩子是 node2 , node3
Add(node1 , 0 , node2);
Add(node1 , 0 , node3);
//node2 的孩子是 node4 , node5 , node6
Add(node2 , 0 , node4);
Add(node2 , 0 , node5);
Add(node2 , 0 , node6);
//node3 的孩子是 node7 , node8
Add(node3 , 0 , node7);
Add(node3 , 0 , node8);
//node5 的孩子是 node9
Add(node5 , 0 , node9);
printf("\n------------------------------------------\n");
//前序遍历
PreOrder(node1);
printf("\n------------------------------------------\n");
//后序遍历
PostOrder(node1);
printf("\n------------------------------------------\n");
return 0;
}
//*******************EndCode***********************************