【数据结构与算法】求孩子链树T中的叶子结点个并求T中度为k的结点个数

题目

  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;
}


结束语

  因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

猜你喜欢

转载自blog.csdn.net/Zchengjisihan/article/details/131540166
今日推荐