用“孩子链表表示法”表示二叉树并实现其操作,#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 19:02:06 浏览: 33
```c
#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;
ChildNode *FirstChild;
} DataNode;
typedef struct ChildTree {
DataNode Nodes[MAX_TREENODE_NUM];
int Root;
int TreeNodeNum;
} ChildTree;
void InitChildTree(ChildTree *t) {
t->Root = -1;
t->TreeNodeNum = 0;
memset(t->Nodes, 0, sizeof(t->Nodes));
}
int AddTreeNode(ChildTree *t, char data, int parent) {
if (t->TreeNodeNum >= MAX_TREENODE_NUM) {
return -1;
}
int i;
for (i = 0; i < t->TreeNodeNum; ++i) {
if (t->Nodes[i].FirstChild == NULL) {
continue;
}
ChildNode *p = t->Nodes[i].FirstChild;
while (p) {
if (p->Child == parent) {
break;
}
p = p->Next;
}
if (p != NULL) {
break;
}
}
if (i >= t->TreeNodeNum) {
if (parent == -1) {
t->Root = t->TreeNodeNum;
}
else {
return -1;
}
}
t->Nodes[t->TreeNodeNum].Data = data;
t->Nodes[t->TreeNodeNum].FirstChild = NULL;
ChildNode *q = (ChildNode *)malloc(sizeof(ChildNode));
q->Child = t->TreeNodeNum;
q->Next = NULL;
if (i < t->TreeNodeNum) {
ChildNode *p = t->Nodes[i].FirstChild;
while (p->Next) {
p = p->Next;
}
p->Next = q;
}
else {
t->Nodes[parent].FirstChild = q;
}
++t->TreeNodeNum;
return t->TreeNodeNum - 1;
}
void InputChildTree(ChildTree *t) {
int n;
printf("请输入二叉树的节点个数:");
scanf("%d", &n);
printf("请输入二叉树的节点数据和其父节点的索引号(根节点父节点为-1):\n");
for (int i = 0; i < n; ++i) {
char data;
int parent;
scanf(" %c%d", &data, &parent);
AddTreeNode(t, data, parent);
}
}
int CountLeafNode(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 index) {
if (t->Nodes[index].FirstChild == NULL) {
return 1;
}
return 0;
}
void PrintPathToRoot(ChildTree *t, int index) {
if (index == -1) {
return;
}
printf("%c", t->Nodes[index].Data);
if (index == t->Root) {
return;
}
ChildNode *p = t->Nodes[index].FirstChild;
while (p) {
if (IsLeafNode(t, p->Child)) {
printf(" -> ");
PrintPathToRoot(t, index);
}
p = p->Next;
}
}
int main() {
ChildTree t;
InitChildTree(&t);
InputChildTree(&t);
printf("叶子节点个数为:%d\n", CountLeafNode(&t));
printf("请输入要查询的节点位置:");
int index;
scanf("%d", &index);
if (IsLeafNode(&t, index)) {
printf("该节点是叶子节点,路径为:");
PrintPathToRoot(&t, index);
printf("\n");
}
else {
printf("该节点不是叶子节点\n");
}
return 0;
}
```
阅读全文