树的双亲表示法,孩子表示法,孩子兄弟表示法(C语言)

本文详细介绍了树的三种表示方法:双亲表示法、孩子表示法和孩子兄弟表示法,通过具体的代码实现展示了每种表示法的特点和应用场景。文章首先讲解了如何使用顺序表实现双亲表示法,随后介绍了孩子表示法的顺序表加链表结构,并最后探讨了孩子兄弟表示法的链表实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树的双亲表示法:使用顺序表

/*#include<stdio.h>
#include<stdlib.h>

//节点结构
typedef struct  Node
{
       char data;
       int parent;
}Node;

//树的结构
typedef struct Tree{
        Node Node[10];
        int n;   //树的节点个数
}Tree;

//创建树
void create_Tree(Tree *T){
        int numNode,i,j=0;
        char data;


        printf("请输入节点个数: ");
        scanf("%d",&numNode);
        T->n = numNode;
        //申请内存

        //各个节点进行赋值
        for(i=0; i< numNode; i++){
			    fflush(stdin);
                printf("请输入第%d个节点\n",i);
                scanf("%c%d",&data,&j);
                T ->Node[i].data = data;
                T ->Node[i].parent = j;
        }
}

//查找某个节点
void  search_Node(Tree* T,char temp){
        int i;
		int flag = 0;
        for(i=0; i< T->n; i++){
                if(T ->Node[i].data == temp){
                        flag = 1;
						printf("%c parentnode's the index is %d",T ->Node[i].data,T ->Node[i].parent);
						break;
                }
        }
		if(!flag){
			printf("no node");
		}

}
int main(){
        Tree T; //
        char ch;
        create_Tree(&T);

        printf("请输出想要查找的节点: \n");
        fflush(stdin); //
        scanf("%c",&ch);
        search_Node(&T,ch);
        printf("\n");
        return 0;
}

*/

孩子表示法:顺序表+链表

/*#include<stdio.h>
#include<stdlib.h>


//链表节点
typedef struct ChildNode
{
        int index;
        struct ChildNode* linkchartNode;
}LNode;
//节点的定义
typedef struct  Node
{
        char data;
        struct ChildNode* child;  //链表
}Node, *TreeNode;

//树的结构
typedef struct Tree
{
        Node node[5]; //顺序表
        int n;   //树节点的个数
}Tree;


//创建数组并存储
void create_Tree(Tree *T){


        int linknodetest;
        int i;
	LNode* p ;
        //创建节点个数
        printf("请输入节点的个数:\n");
        fflush(stdin);
        scanf("%d",&(T ->n));


        //逐个赋值
        for(i = 0; i < T->n; i++){
			int j = 0;
			printf("请输入第%d节点的data: ",i);
			fflush(stdin);
			scanf("%c",&(T->node[i].data));
			//创建第i个顺序表的节点   
			T->node[i].child =  (LNode *)malloc(sizeof(LNode));
			T->node[i].child ->linkchartNode = NULL;
            
			//为链表节点赋值
			printf("请输入孩子节点的数量: ");
			scanf("%d",&linknodetest);
			p = T->node[i].child;
			while(j <linknodetest){
				 LNode* newlinknode = (LNode *)malloc(sizeof(LNode));
				 newlinknode ->linkchartNode = NULL;
				printf("请输出第%d个节点的第%d个孩子节点:\n",i,j);
				fflush(stdin);
				scanf("%d",&(newlinknode ->index));
				p ->linkchartNode = newlinknode;
				p =  p ->linkchartNode;
				j++;
			}
        }
}

//搜索树的某个节点
void Search_Node(Tree *T,char temp){
        int i;
	int flag =0;
        LNode* p ;

        for(i = 0; i < T->n; i++){
                if(temp == T->node[i].data){
		    flag = 1;
                    printf("%c ",T->node[i].data);
                    //还需要将孩子节点输出
                    p = (T->node[i].child) ->linkchartNode ;
                    printf("孩子节点有:");
                    while(p){
                            printf("%c ",T->node[p ->index].data);
                            p = p ->linkchartNode;
                    }
                    break;
                }
        }
		if(!flag){
			 printf("no node!");
		}

}

int main(){
        Tree T;
        char ch;
        create_Tree(&T);
        printf("请输入搜索的节点:\n");
		fflush(stdin);
        scanf("%c",&ch);

        Search_Node(&T,ch);
        printf("\n");
        return 0;
        
}
*/

孩子兄弟表示法:链表

//用孩子兄弟法表示树,本质上就是创建二叉树
#include<stdio.h>
#include<stdlib.h>

//链表节点结构
typedef struct Node{
        char data;
        struct Node* child;
        struct Node* brother;
}LinkNode;


int n = 1;

void createTree_ChildAndParent(LinkNode *T){

        char temp;
       
        //节点个数
        scanf("%c",&temp); 
		getchar();
		fflush(stdin);

		if(temp =='#'){
			n--;
			T = NULL;
		}else{

			T = (LinkNode *)malloc(sizeof(LinkNode));
			T->data = temp;
			printf("output %c\n",temp);
			n++;
			createTree_ChildAndParent(T->child);
			createTree_ChildAndParent(T->brother);
		}
}

//中序遍历
void mid_Search(LinkNode *T){
        if(T){
                mid_Search(T->child);
                printf("%c ",T->data);
                mid_Search(T->brother);

        }
}
int main(){
        LinkNode T;
		printf("请输入节点的信息:\n");
		createTree_ChildAndParent(&T);
        mid_Search(&T);
        return 0;


}

 

转载于:https://my.oschina.net/1024and1314/blog/3086202

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值