用“孩子链表表示法”表示二叉树并实现其操作,#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)给定结点数据,判断其是否为叶子结点。如果是则输出叶子结点到根结点的路径。
时间: 2023-12-18 13:03:08 浏览: 60
链表表示二叉树
以下为完整的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 InitTree(ChildTree *T) {
T->Root = -1;
T->TreeNodeNum = 0;
for (int i = 0; i < MAX_TREENODE_NUM; i++) {
T->Nodes[i].Data = '\0';
T->Nodes[i].FirstChild = NULL;
}
}
int CreateNode(ChildTree *T, char data) {
if (T->TreeNodeNum >= MAX_TREENODE_NUM) {
return -1;
}
T->Nodes[T->TreeNodeNum].Data = data;
T->TreeNodeNum++;
return T->TreeNodeNum - 1;
}
void AddChild(ChildTree *T, int parent, int child) {
if (parent < 0 || parent >= T->TreeNodeNum || child < 0 || child >= T->TreeNodeNum) {
return;
}
ChildNode *p = T->Nodes[parent].FirstChild;
if (p == NULL) {
T->Nodes[parent].FirstChild = (ChildNode *)malloc(sizeof(ChildNode));
T->Nodes[parent].FirstChild->Child = child;
T->Nodes[parent].FirstChild->Next = NULL;
}
else {
while (p->Next != NULL) {
p = p->Next;
}
p->Next = (ChildNode *)malloc(sizeof(ChildNode));
p->Next->Child = child;
p->Next->Next = NULL;
}
}
void InputTree(ChildTree *T) {
printf("请输入二叉树的节点信息(节点数目不超过%d个):\n", MAX_TREENODE_NUM);
printf("格式为:节点数目 节点信息(按照层次遍历顺序输入,空节点用#代替)\n");
int n;
char data;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf(" %c", &data);
if (data != '#') {
int node = CreateNode(T, data);
if (i == 0) {
T->Root = node;
}
if (i % 2 == 1) {
int parent = (i - 1) / 2;
AddChild(T, parent, node);
}
else {
int parent = i / 2 - 1;
AddChild(T, parent, node);
}
}
}
}
int CountLeaves(ChildTree *T) {
int count = 0;
for (int i = 0; i < T->TreeNodeNum; i++) {
if (T->Nodes[i].Data != '\0' && T->Nodes[i].FirstChild == NULL) {
count++;
}
}
return count;
}
int IsLeaf(ChildTree *T, int node) {
if (node < 0 || node >= T->TreeNodeNum || T->Nodes[node].Data == '\0') {
return 0;
}
if (T->Nodes[node].FirstChild == NULL) {
return 1;
}
else {
return 0;
}
}
void PrintPath(ChildTree *T, int node) {
if (node < 0 || node >= T->TreeNodeNum || T->Nodes[node].Data == '\0') {
return;
}
printf("%c", T->Nodes[node].Data);
if (IsLeaf(T, node)) {
return;
}
ChildNode *p = T->Nodes[node].FirstChild;
while (p != NULL) {
printf("->");
PrintPath(T, p->Child);
p = p->Next;
}
}
int main() {
ChildTree T;
InitTree(&T);
InputTree(&T);
printf("叶子节点个数为:%d\n", CountLeaves(&T));
char data;
printf("请输入要查询的节点信息:");
scanf(" %c", &data);
for (int i = 0; i < T.TreeNodeNum; i++) {
if (T.Nodes[i].Data == data && IsLeaf(&T, i)) {
printf("该节点是叶子节点,路径为:");
PrintPath(&T, i);
printf("\n");
return 0;
}
}
printf("该节点不是叶子节点\n");
return 0;
}
```
程序运行时会先让用户输入二叉树的节点信息,然后计算叶子节点个数,并根据用户输入的节点信息判断是否为叶子节点以及输出叶子节点到根节点的路径。
阅读全文