题目
Qestion: 假设一棵非空树采用孩子链存储结构,每个结点值均为单个字符,求树t中的叶子结点个数,以及求树t中度为k的结点个数
该题所用的二叉树形
孩子链表
数据结构与定义
#include <stdio.h>
// 孩子结点
struct CNode
{
int index;
struct CNode *Next;
};
//
struct CLinkArr
{
char data;
struct CNode *firstChild;
};
// 孩子链树
struct CTree
{
int NodeNum;
int root;
struct CLinkArr node[20];
};
求孩子链树t中的叶子结点个数
int LeafNodeNumber(CTree &tree){
int cnt = 0;
for (int i = 0; i < tree.NodeNum; i++)
{
if (tree.node[i].data != NULL && tree.node[i].firstChild == nullptr)
{
cnt++;
}
}
return cnt;
}
其代码快照
求孩子链树t中度为k的结点个数
int LeafDegreeIsK(CTree &tree, int k){
int cnt = 0;
for ( int i = 0; i < tree.NodeNum; i++)
{
int childNodeNum = 0;
CNode *tmp = tree.node[i].firstChild;
while (tmp != nullptr)
{
tmp = tmp->Next;
childNodeNum ++;
}
if (childNodeNum == k)
{
cnt++;
}
}
return cnt;
}
其代码快照
完整代码
#include <stdio.h>
// 孩子结点
struct CNode
{
int index;
struct CNode *Next;
};
//
struct CLinkArr
{
char data;
struct CNode *firstChild;
};
// 孩子链树
struct CTree
{
int NodeNum;
int root;
struct CLinkArr node[20];
};
void initChildTree(CTree &tree)
{
tree.NodeNum = 0;
tree.root = -1;
for (int i = 0; i < 20; i++)
{
tree.node[i].data = NULL;
tree.node[i].firstChild = nullptr;
}
}
//创建二叉树
void createChildTree(CTree &tree)
{
tree.root = 0;
tree.node[tree.root].data = 'R';
tree.node[tree.root + 1].data = 'A';
tree.node[tree.root + 2].data = 'B';
tree.node[tree.root + 3].data = 'C';
tree.node[tree.root + 4].data = 'D';
tree.node[tree.root + 5].data = 'E';
tree.node[tree.root + 6].data = 'F';
tree.node[tree.root + 7].data = 'G';
tree.node[tree.root + 8].data = 'H';
tree.node[tree.root + 9].data = 'K';
tree.node[tree.root].firstChild = new CNode;
tree.node[tree.root].firstChild->index = 1;
tree.node[tree.root].firstChild->Next = new CNode;
tree.node[tree.root].firstChild->Next->index = 2;
tree.node[tree.root].firstChild->Next->Next = new CNode;
tree.node[tree.root].firstChild->Next->Next->index = 3;
tree.node[tree.root].firstChild->Next->Next->Next = nullptr;
tree.node[tree.root + 1].firstChild = new CNode;
tree.node[tree.root + 1].firstChild->index = 4;
tree.node[tree.root + 1].firstChild->Next = new CNode;
tree.node[tree.root + 1].firstChild->Next->index = 5;
tree.node[tree.root + 1].firstChild->Next->Next = nullptr;
tree.node[tree.root + 2].firstChild = nullptr;
tree.node[tree.root + 3].firstChild = new CNode;
tree.node[tree.root + 3].firstChild->index = 6;
tree.node[tree.root + 3].firstChild->Next = nullptr;
tree.node[tree.root + 6].firstChild = new CNode;
tree.node[tree.root + 6].firstChild->index = 7;
tree.node[tree.root + 6].firstChild->Next = new CNode;
tree.node[tree.root + 6].firstChild->Next->index = 8;
tree.node[tree.root + 6].firstChild->Next->Next = new CNode;
tree.node[tree.root + 6].firstChild->Next->Next->index = 9;
tree.node[tree.root + 6].firstChild->Next->Next->Next = nullptr;
tree.NodeNum = 10;
}
int LeafNodeNumber(CTree &tree){
int cnt = 0;
for (int i = 0; i < tree.NodeNum; i++)
{
if (tree.node[i].data != NULL && tree.node[i].firstChild == nullptr)
{
cnt++;
}
}
return cnt;
}
int LeafDegreeIsK(CTree &tree, int k){
int cnt = 0;
for ( int i = 0; i < tree.NodeNum; i++)
{
int childNodeNum = 0;
CNode *tmp = tree.node[i].firstChild;
while (tmp != nullptr)
{
tmp = tmp->Next;
childNodeNum ++;
}
if (childNodeNum == k)
{
cnt++;
}
}
return cnt;
}
int main()
{
CTree tree;
initChildTree(tree);
createChildTree(tree);
int leafNodeCnt = LeafNodeNumber(tree);
printf("树中叶子结点的个数为%d\n", leafNodeCnt);
printf("请输入k的值");
int k;
scanf("%d", &k);
int NodeDegreeisK = LeafDegreeIsK(tree, k);
printf("树中度为%d的结点个数为%d", k, NodeDegreeisK);
return 0;
}
结束语
因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!