#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;
}
数据结构复习:树的顺序存储实现(双亲表示法)
最新推荐文章于 2024-07-06 09:00:00 发布