c语言编程:用“孩子链表表示法”表示二叉树并实现其操作,要求完成如下设计并编写代码、调试通过: (1)设计函数将二叉树以“孩子链表表示法”输入到计算机中(自定义输入数据的格式和方式) (2)设计函数计算“孩子链表表示法”下二叉树的叶子结点个数。 (3)设计函数实现如下功能:给定结点数据(如字符“E”),判断其是否为叶子结点。如果是则输出叶子结点到根结点的路径。已给出部分代码:#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;(给出测试实例)
时间: 2023-11-27 13:50:59 浏览: 96
以下是实现代码:
```
#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, char *str) {
int i = 0, j = 0, k = 0, n = strlen(str);
ChildNode *p = NULL, *q = NULL;
T->TreeNodeNum = n;
for (i = 0; i < n; i++) {
T->Nodes[i].Data = str[i];
T->Nodes[i].FirstChild = NULL;
}
for (i = 0; i < n; i++) {
if (str[i] != '#') {
j = i * 2 + 1;
if (j < n && str[j] != '#') {
p = (ChildNode *)malloc(sizeof(ChildNode));
p->Child = j;
p->Next = NULL;
T->Nodes[i].FirstChild = p;
q = p;
}
j++;
if (j < n && str[j] != '#') {
p = (ChildNode *)malloc(sizeof(ChildNode));
p->Child = j;
p->Next = NULL;
if (T->Nodes[i].FirstChild == NULL) {
T->Nodes[i].FirstChild = p;
}
else {
q->Next = p;
}
q = p;
}
}
}
}
// 计算叶子结点个数
int CountLeafNode(ChildTree *T) {
int i = 0, count = 0;
ChildNode *p = NULL;
for (i = 0; i < T->TreeNodeNum; i++) {
if (T->Nodes[i].FirstChild == NULL) {
count++;
}
else {
p = T->Nodes[i].FirstChild;
while (p != NULL) {
if (T->Nodes[p->Child].FirstChild == NULL) {
count++;
}
p = p->Next;
}
}
}
return count;
}
// 判断给定结点是否为叶子结点,并输出叶子结点到根结点的路径
void FindNodePath(ChildTree *T, int node, int path[], int top) {
int i = 0;
ChildNode *p = NULL;
if (T->Nodes[node].FirstChild == NULL) {
printf("%c", T->Nodes[node].Data);
for (i = top - 1; i >= 0; i--) {
printf(" -> %c", T->Nodes[path[i]].Data);
}
printf("\n");
}
else {
path[top] = node;
p = T->Nodes[node].FirstChild;
while (p != NULL) {
FindNodePath(T, p->Child, path, top + 1);
p = p->Next;
}
}
}
int main() {
ChildTree T;
char str[MAX_TREENODE_NUM];
int leaf_count = 0, path[MAX_TREENODE_NUM];
memset(path, 0, sizeof(path));
printf("请输入二叉树的孩子链表表示法,以#表示空节点:");
scanf("%s", str);
CreateTree(&T, str);
leaf_count = CountLeafNode(&T);
printf("该二叉树中叶子结点的个数为:%d\n", leaf_count);
printf("请输入要查询的二叉树节点数据:");
char c;
while (scanf("%c", &c) != EOF && c != '\n');
scanf("%c", &c);
for (int i = 0; i < MAX_TREENODE_NUM; i++) {
path[i] = -1;
}
printf("从叶子结点到根结点的路径为:\n");
FindNodePath(&T, T.Root, path, 0);
return 0;
}
```
其中,CreateTree函数用于创建二叉树;CountLeafNode函数用于计算叶子结点的个数;FindNodePath函数用于判断给定结点是否为叶子结点,并输出叶子结点到根结点的路径。在主函数中,先调用CreateTree函数创建二叉树,然后调用CountLeafNode函数计算叶子结点的个数,最后调用FindNodePath函数查找给定结点是否为叶子结点,并输出叶子结点到根结点的路径。
阅读全文