树的孩子表示法
树的孩子表示法,概念很简单,是用一个数组保存每个节点的数据,每个节点再用1个链表保存树的关系
比如{<R,A>,<R, B>},这个数有3个节点,数组长度是3,然后有3个链表
R的链表有{头结点,A,B}
A的链表有{头结点}
B的链表有{头结点}
下面用代码实现
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX_TREE_SIZE 100
typedef struct RightNode{
int data;//结点在数组的下标
struct RightNode *next;//孩子链表
} RightNode;
typedef struct LeftNode{
char data;//结点的值
struct RightNode *child;//该结点的孩子
} LeftNode;
typedef struct{
LeftNode left_node[MAX_TREE_SIZE];
int n;//结点数
int r;//根的位置
} ChileTree;
void init_data(ChileTree &tree){
printf("输入节点数量:\n");
scanf("%d", &(tree.n));
for (int i = 0; i<tree.n; i++) {
printf("输入第%d个节点内容:\n", i+1);
getchar();
scanf("%c", &tree.left_node[i].data);
//链表使用头结点
tree.left_node[i].child = (RightNode *)malloc(sizeof(RightNode));
tree.left_node[i].child->next = NULL;
//我有几个孩子,孩子在哪
int child_num = 0;
printf("输入%c有几个孩子:\n", tree.left_node[i].data);
scanf("%d", &child_num);
int k = 0;
RightNode *p = tree.left_node[i].child;//链表的头结点
while (child_num>0 && k<child_num) {//这里可以检查孩子个数和总结点的合法性
printf("输入第 %d 个孩子节点在顺序表中的位置(0开始):\n", k+1);
RightNode *right_node = (RightNode *)malloc(sizeof(RightNode));
scanf("%d", &right_node->data);//这里可以检查数组下标的合法性
right_node->next = NULL;
p->next = right_node;
p = right_node;//p指针要挪挪位置,不能挪头结点的指针内容
k++;
}
printf("构造%c节点完成,他有%d个孩子节点\n", tree.left_node[i].data, child_num);
}
}
void print_data(ChileTree tree){
int i = 0;
while (i<tree.n) {
cout << "父亲节点 nodes[" << i << "]:" << tree.left_node[i].data << endl;
RightNode *p = tree.left_node[i].child;//链表的头结点
while (p->next!=NULL) {
int j = p->next->data;//顺序表的位置
cout << "它的孩子节点 nodes[" << j << "]:" << tree.left_node[j].data << endl;
p = p->next;
}
i++;
}
}
int main(){
std::cout << "welcome, to my world!" << std::endl;
ChileTree tree;
// cout << "size of:" << sizeof(tree) <<endl;
init_data(tree);
print_data(tree);
return 0;
}
输出
welcome, to my world!
输入节点数量:
3
输入第1个节点内容:
R
输入R有几个孩子:
2
输入第 1 个孩子节点在顺序表中的位置(0开始):
1
输入第 2 个孩子节点在顺序表中的位置(0开始):
2
构造R节点完成,他有2个孩子节点
输入第2个节点内容:
A
输入A有几个孩子:
0
构造A节点完成,他有0个孩子节点
输入第3个节点内容:
B
输入B有几个孩子:
0
构造B节点完成,他有0个孩子节点
父亲节点 nodes[0]:R
它的孩子节点 nodes[1]:A
它的孩子节点 nodes[2]:B
父亲节点 nodes[1]:A
父亲节点 nodes[2]:B
Program ended with exit code: 0