树的双亲表示法
此前写过二叉树的顺序存储和链式存储,此篇文章将介绍普通树是如何存储的...
通常,存储具有普通树结构数据的方法有 3 种:
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
而本篇文章将优先介绍双亲表示法!!!
双亲表示法采用顺序表(数组)存储普通树,其实现的核心思想是:顺序存储各个节点的同时,给各节点附加一个记录其父节点位置的变量
图 1 普通树
双亲表示法存储图 1 中普通树,其存储状态如图 2 所示 :
图 2 双亲表示法存储普通树示意图
注意!!!根节点没有父节点,因此根节点记录父节点位置的变量通常置为 -1
树的双亲表示法的代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 宏定义树中结点的最大数量
typedef struct Snode{
char data;
int parent;
} PTNode;
typedef struct{
PTNode tnode[MAX_SIZE]; // 存放树中所有结点
int n; // 结点数
} PTree;
PTree *InitPNode(PTree *tree){
int j;
char ch;
printf("请输入节点个数:\n"); // 10
scanf("%d", &(tree->n));
printf("请输入结点的值和其双亲位于数组中的位置下标:\n");
for(int i = 0; i < tree->n; i++){
getchar(); // 作用: 读取回车符
scanf("%c %d", &ch, &j);
tree->tnode[i].data = ch;
tree->tnode[i].parent = j;
}
return tree;
}
void FindParent(PTree *tree){
char a;
int isfind = 0; // 是否找到的标志
printf("请输入要查询的结点值:\n");
getchar(); // 作用: 读取回车符
scanf("%c", &a); // C
for(int i = 0; i < tree->n; i++){
if(tree->tnode[i].data == a){
isfind = 1;
int ad = tree->tnode[i].parent;
printf("%c的父节点为 %c,存储位置下标为 %d", a, tree->tnode[ad].data, ad);
break;
}
}
if(isfind == 0){
printf("树中无此节点");
}
}
int main(void){
PTree *tree = (PTree*)malloc(sizeof(PTree));
// 初始化数组(数组数据项为" ",父节点位置为 0)
for(int i = 0; i < MAX_SIZE; i++){
tree->tnode[i].data = ' ';
tree->tnode[i].parent = 0;
}
tree = InitPNode(tree);
FindParent(tree);
return 0;
}