数据结构复习:树的顺序存储实现(双亲表示法)

#include <stdio.h>
//树的顺序 存储实现(双亲表示法)
//优点:找双亲
//缺点:找孩子
#define MAX_TREE_SIZE 100 //树的结点最大个数
typedef struct {
    char value;
}ElemType;
typedef struct {
    ElemType data; // 数据元素
    int parent;//存储双亲下标

}PTNode;
typedef struct {
    PTNode nodes[MAX_TREE_SIZE];
    int n;//存储当前结点个数
}PTree;


//初始化空树
void InitPTree(PTree &T) {
    T.n = 0;
}


//找所有孩子结点
PTree GetChildNodes(PTree T,int parIndex) {
    PTree tree;
    InitPTree(tree);
    int j = 0;
    for (int i = 0; i < T.n; ++i) {
        if(T.nodes[i].parent == parIndex) {
            tree.nodes[j++]=T.nodes[i];
            tree.n++;
        }
    }
    return tree;

}



int main() {

    PTree T;
    InitPTree(T);
    T.nodes[0].data = {'A'};
    T.nodes[0].parent = -1;
    T.nodes[1].data = {'B'};
    T.nodes[1].parent = 0;//A->B
    T.nodes[2].data = {'C'};
    T.nodes[2].parent = 0; // A->C
    T.nodes[3].data = {'D'};
    T.nodes[3].parent = 0; // A->D


    T.nodes[4].data = {'E'};
    T.nodes[4].parent = 1;//B->E
    T.nodes[5].data = {'F'};
    T.nodes[5].parent = 1;//B->F

    T.nodes[6].data = {'G'};
    T.nodes[6].parent = 2;//C->G

    T.nodes[7].data = {'H'};
    T.nodes[7].parent = 3;//D->H
    T.nodes[8].data = {'I'};
    T.nodes[8].parent = 3;//D->I
    T.nodes[9].data = {'J'};
    T.nodes[9].parent = 3;//D->J

    T.nodes[10].data = {'K'};
    T.nodes[10].parent = 4;//E->K

    T.nodes[11].data = {'M'};
    T.nodes[11].parent = 7;// H->M

    T.n = 12;

    //E结点添加一个孩子L
    T.nodes[12].data = {'L'};
    T.nodes[12].parent = 4;//E->L

    T.n++;

    //删除结点 G
    //方法1 把 parent 设置为 -1
    T.nodes[12].data={};
    T.nodes[6].parent = {-2};
    T.n--;
    //方法2
    //移动后面的元素到G位置处
    T.nodes[6].data = T.nodes[12].data;
    T.nodes[6].parent = T.nodes[12].parent;
    T.nodes[12].data={};
    T.nodes[12].parent=-2;
    T.n--;

    PTNode p = T.nodes[3];//
    //双亲表示法可以直接找到双亲,但是如果要寻找孩子结点就要从头开始遍历
    if(p.parent!=-1) {
        printf("结点%c的双亲:%c\n",p.data,T.nodes[p.parent]);
    } else {
        printf("结点%c为根结点:%c\n",p.data);
    }

    PTree childNodes = GetChildNodes(T,3);

    printf("结点%c的孩子结点:\n",p.data);
    for (int i = 0; i < childNodes.n; ++i) {
        printf("%c ",childNodes.nodes[i].data);
    }
    printf("\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值