用“孩子链表表示法”表示二叉树并实现其操作,#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-29 22:05:03 浏览: 109
链表表示二叉树
代码如下:
```c
#include <stdio.h>
#include <stdlib.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 CreateChildTree(ChildTree *T);
void PrintChildTree(ChildTree T);
int CountLeafNodes(ChildTree T);
int IsLeafNode(ChildTree T, int i);
void PrintPathFromNodeToRoot(ChildTree T, int i);
int main() {
ChildTree T;
CreateChildTree(&T);
printf("孩子链表表示法下二叉树的叶子结点个数为:%d\n", CountLeafNodes(T));
char c;
printf("请输入要查找的结点:");
scanf(" %c", &c);
int i;
for (i = 0; i < T.TreeNodeNum; i++) {
if (T.Nodes[i].Data == c) {
break;
}
}
if (i == T.TreeNodeNum) {
printf("未找到该节点\n");
return 0;
}
if (IsLeafNode(T, i)) {
printf("%c 是叶子结点\n", c);
} else {
printf("%c 不是叶子结点\n", c);
printf("从叶子结点 %c 到根结点的路径为:", T.Nodes[i].Data);
PrintPathFromNodeToRoot(T, i);
printf("\n");
}
return 0;
}
void CreateChildTree(ChildTree *T) {
printf("请输入二叉树中结点的个数:");
scanf("%d", &T->TreeNodeNum);
printf("请按照层序遍历的顺序依次输入每个结点的数据(空格分隔),如果该节点没有孩子则输入“#”:\n");
for (int i = 0; i < T->TreeNodeNum; i++) {
// 读入结点数据
scanf(" %c", &T->Nodes[i].Data);
// 初始化孩子链表为空
T->Nodes[i].FirstChild = NULL;
// 判断是否为根结点
if (i == 0) {
T->Root = i;
} else {
// 读入该节点的父节点位置
int parent;
scanf("%d", &parent);
// 将该节点添加到父节点的孩子链表中
ChildNode *p = T->Nodes[parent].FirstChild;
if (p == NULL) {
T->Nodes[parent].FirstChild = (ChildNode *) malloc(sizeof(ChildNode));
T->Nodes[parent].FirstChild->Child = i;
T->Nodes[parent].FirstChild->Next = NULL;
} else {
while (p->Next != NULL) {
p = p->Next;
}
p->Next = (ChildNode *) malloc(sizeof(ChildNode));
p->Next->Child = i;
p->Next->Next = NULL;
}
}
}
}
void PrintChildTree(ChildTree T) {
printf("孩子链表表示法下的二叉树:\n");
for (int i = 0; i < T.TreeNodeNum; i++) {
printf("%c -> ", T.Nodes[i].Data);
ChildNode *p = T.Nodes[i].FirstChild;
while (p != NULL) {
printf("%c ", T.Nodes[p->Child].Data);
p = p->Next;
}
printf("\n");
}
}
int CountLeafNodes(ChildTree T) {
int count = 0;
for (int i = 0; i < T.TreeNodeNum; i++) {
if (T.Nodes[i].FirstChild == NULL) {
count++;
}
}
return count;
}
int IsLeafNode(ChildTree T, int i) {
return T.Nodes[i].FirstChild == NULL;
}
void PrintPathFromNodeToRoot(ChildTree T, int i) {
printf("%c", T.Nodes[i].Data);
while (i != T.Root) {
// 找到父节点位置
int parent = -1;
for (int j = 0; j < T.TreeNodeNum; j++) {
ChildNode *p = T.Nodes[j].FirstChild;
while (p != NULL) {
if (p->Child == i) {
parent = j;
break;
}
p = p->Next;
}
if (parent != -1) {
break;
}
}
// 输出父节点数据并更新 i 值
printf(" <- %c", T.Nodes[parent].Data);
i = parent;
}
}
```
阅读全文