用“孩子链表表示法”表示二叉树并实现其操作,#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)设计函数将二叉树以“孩子链表表示法”输入到计算机中(自定义输入数据的格式和方式)设计函数计算“孩子链表表示法”下二叉树的叶子结点个数。 (3)设计函数实现如下功能:给定结点数据,判断其是否为叶子结点。如果是则输出叶子结点到根结点的路径
时间: 2024-01-30 11:01:28 浏览: 86
代码如下:
```
#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 CreateBinaryTree(ChildTree *T) {
int i, j;
char data;
int child;
int flag[MAX_TREENODE_NUM] = {0}; // 标记是否为根节点
printf("请输入二叉树的节点数:");
scanf("%d", &(T->TreeNodeNum));
printf("请输入每个节点的数据和孩子节点(没有则输入-1):\n");
for (i = 0; i < T->TreeNodeNum; i++) {
scanf(" %c %d", &data, &child);
T->Nodes[i].Data = data;
if (child != -1) {
T->Nodes[i].FirstChild = (ChildNode*)malloc(sizeof(ChildNode));
T->Nodes[i].FirstChild->Child = child;
T->Nodes[i].FirstChild->Next = NULL;
flag[child] = 1;
while (1) {
scanf("%d", &child);
if (child == -1)
break;
T->Nodes[i].FirstChild->Next = (ChildNode*)malloc(sizeof(ChildNode));
T->Nodes[i].FirstChild->Next->Child = child;
T->Nodes[i].FirstChild->Next->Next = NULL;
T->Nodes[i].FirstChild = T->Nodes[i].FirstChild->Next;
flag[child] = 1;
}
}
else {
T->Nodes[i].FirstChild = NULL;
}
}
for (j = 0; j < T->TreeNodeNum; j++) {
if (!flag[j]) {
T->Root = j;
break;
}
}
}
// 计算叶子结点的个数
int CountLeafNode(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 index) {
if (T->Nodes[index].FirstChild == NULL)
return 1;
else
return 0;
}
// 输出叶子结点到根结点的路径
void PrintPathToRoot(ChildTree *T, int index) {
if (index == T->Root) {
printf("%c", T->Nodes[index].Data);
return;
}
else if (IsLeafNode(T, index)) {
printf("没有该节点或该节点不是叶子结点!");
return;
}
else {
ChildNode *p = T->Nodes[index].FirstChild;
while (p != NULL) {
if (IsLeafNode(T, p->Child)) {
printf("%c->%c", T->Nodes[index].Data, T->Nodes[p->Child].Data);
}
else {
printf("%c->", T->Nodes[index].Data);
PrintPathToRoot(T, p->Child);
}
p = p->Next;
if (p != NULL)
printf(", ");
}
}
}
int main() {
ChildTree T;
CreateBinaryTree(&T);
printf("叶子结点的个数为:%d\n", CountLeafNode(&T));
char data;
printf("请输入要查找路径的节点:");
scanf(" %c", &data);
int index = -1;
int i;
for (i = 0; i < T.TreeNodeNum; i++) {
if (T.Nodes[i].Data == data) {
index = i;
break;
}
}
PrintPathToRoot(&T, index);
return 0;
}
```
阅读全文