用“孩子链表表示法”表示二叉树并实现其操作,#define MAX_TREENODE_NUM 100 // "孩子链表表示法" 中二叉树的最大节点个数 // "孩子链表表示法" 中孩子链表节点结构体类型定义 typedef struct ChildNode { int Child; // 孩子节点的位置(索引号) struct ChildNode *Next; // 指向下一个孩子的指针 }ChildNode; // "孩子链表表示法" 中二叉树节点结构体类型定义 typedef struct DataNode { char Data; // 二叉树中节点的数据类型 struct ChildNode *FirstChild; // 指向二叉树中节点的第一个孩子的指针 }DataNode; // "孩子链表表示法" 中二叉树结构体类型定义 typedef struct ChildTree { DataNode Nodes[ MAX_TREENODE_NUM ]; // 二叉树的"孩子链表表示法" int Root; // 树根节点的游标 - 静态指针值 int TreeNodeNum // 二叉树中实际的节点数目 }ChildTree; 要求完成如下设计并编写完整的c语言代码包含主函数并调试通过并给出示例输入: (1)设计函数将二叉树以“孩子链表表示法”输入到计算机中(自定义输入数据的格式和方式)(2)设计函数计算“孩子链表表示法”下二叉树的叶子结点个数。(3)给定结点数据,判断其是否为叶子结点。如果是则输出叶子结点到根结点的路径。
时间: 2024-01-05 07:02:06 浏览: 69
完整代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TREENODE_NUM 100
typedef struct ChildNode {
int Child; // 孩子节点的位置(索引号)
struct ChildNode *Next; // 指向下一个孩子的指针
} ChildNode;
typedef struct DataNode {
char Data; // 二叉树中节点的数据类型
struct ChildNode *FirstChild; // 指向二叉树中节点的第一个孩子的指针
} DataNode;
typedef struct ChildTree {
DataNode Nodes[MAX_TREENODE_NUM]; // 二叉树的"孩子链表表示法"
int Root; // 树根节点的游标 - 静态指针值
int TreeNodeNum; // 二叉树中实际的节点数目
} ChildTree;
// 以孩子链表表示法输入二叉树
void CreateTree(ChildTree *T) {
int i, j;
printf("请输入二叉树的节点数目:");
scanf("%d", &(T->TreeNodeNum));
getchar(); // 去掉输入缓冲区中的回车符
printf("请按照以下格式输入二叉树节点的信息,用空格分隔:\n");
printf("节点编号 节点数据 父节点编号\n");
for(i = 0; i < T->TreeNodeNum; i++) {
scanf("%d %c %d", &j, &(T->Nodes[i].Data), &j);
T->Nodes[i].FirstChild = NULL;
}
for(i = 0; i < T->TreeNodeNum; i++) {
scanf("%d", &j);
if(j == -1) {
T->Root = i;
continue;
}
ChildNode *p = (ChildNode *)malloc(sizeof(ChildNode));
p->Child = i;
p->Next = T->Nodes[j].FirstChild;
T->Nodes[j].FirstChild = p;
}
}
// 计算孩子链表表示法下二叉树的叶子结点个数
int CountLeafNodes(ChildTree T) {
int i, count = 0;
for(i = 0; i < T.TreeNodeNum; i++) {
if(T.Nodes[i].FirstChild == NULL) {
count++;
}
}
return count;
}
// 判断节点是否为叶子结点,并输出叶子结点到根节点的路径
int IsLeafNode(ChildTree T, int i) {
int j, flag = 0;
for(j = 0; j < T.TreeNodeNum; j++) {
if(T.Nodes[j].FirstChild != NULL && T.Nodes[j].FirstChild->Child == i) {
flag = 1;
break;
}
}
if(flag == 0) { // i是根节点
printf("%c", T.Nodes[T.Root].Data);
return 0;
}
if(T.Nodes[i].FirstChild == NULL) { // i是叶子结点
printf("%c", T.Nodes[i].Data);
return 1;
}
int isLeaf = IsLeafNode(T, j);
if(isLeaf) {
printf("->%c", T.Nodes[i].Data);
}
return isLeaf;
}
int main() {
ChildTree T;
CreateTree(&T);
printf("叶子结点个数:%d\n", CountLeafNodes(T));
printf("请输入要查询的节点编号:");
int i;
scanf("%d", &i);
if(IsLeafNode(T, i)) {
printf("->%c\n", T.Nodes[T.Root].Data);
}
return 0;
}
```
示例输入:
```
请输入二叉树的节点数目:7
请按照以下格式输入二叉树节点的信息,用空格分隔:
节点编号 节点数据 父节点编号
0 A -1
1 B 0
2 C 0
3 D 1
4 E 1
5 F 2
6 G 2
0
```
示例输出:
```
叶子结点个数:3
请输入要查询的节点编号:4
B->A
```
阅读全文