3.1 树的存储结构

3.1 树的存储结构_哔哩哔哩_bilibili

 

//双亲表示法(顺序存储)
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define MAXN 100 //最大结点数

//树结点的定义
typedef struct{ 
   char data;  //数据域
   int parent; //双亲的下标
} PTNode;

//双亲法的树类型定义
typedef struct{ 
   PTNode nodes[MAXN]; //树结点的数组
   int n;              //结点数
} PTree;

int main(){
    PTree T;
    T.n=4;
    T.nodes[0].data='A';
    T.nodes[1].data='B';
    T.nodes[2].data='C';
    T.nodes[3].data='D';
    T.nodes[0].parent=-1;
    T.nodes[1].parent=0;
    T.nodes[2].parent=0;
    T.nodes[3].parent=0;    
    
    for(int i=0;i<T.n;i++)
        printf("%d ",T.nodes[i].parent);
    return 0;
}

 

//孩子表示法(顺序+链式存储)
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define MAXV 100  //最大结点数

//链结点的定义
typedef struct LNode{
   int child;          //孩子的下标
   struct LNode *next; //下一个孩子
} LNode;

//树结点的定义
typedef struct{
   char data;         //数据域
   LNode *firstChild; //第一个孩子
} CTNode;

//孩子法的树类型定义
typedef struct{
   CTNode nodes[MAXV]; //树结点的数组
   int n,r;            //结点数,根的下标
} CTree;

int main(){
    CTree T;
    T.n=4;
    T.r=0;
    T.nodes[0].data='A';
    T.nodes[1].data='B';
    T.nodes[2].data='C';
    T.nodes[3].data='D';
    
    LNode *p=(LNode*)malloc(sizeof(LNode));
    p->child=1;
    T.nodes[0].firstChild=p;
    
    p=(LNode*)malloc(sizeof(LNode));
    p->child=2;
    T.nodes[0].firstChild->next=p;

    p=(LNode*)malloc(sizeof(LNode));
    p->child=3;
    T.nodes[0].firstChild->next->next=p;
    
    for(LNode *p=T.nodes[0].firstChild; p; p=p->next)
        printf("%c ",T.nodes[p->child].data); //输出A的孩子
    return 0;
}

 

//孩子兄弟表示法(链式存储)
typedef struct CSNode{ //树结点的定义
    char data; //数据域
    struct CSNode *firstchild;  //第一个孩子
    struct CSNode *nextsibling; //右兄弟指针
}CSNode,*CSTree;

 

.

posted @ 2026-09-30 07:02  董晓  阅读(9)  评论(0)    收藏  举报