求二叉树中的结点个数、叶子结点个数、某结点层次和二叉树宽度

/**
*    实验题目:
*        求二叉树中的结点个数、叶子结点个数、某结点层次和二叉树宽度
*    实验目的:
*        掌握二叉树遍历算法的应用,熟练使用先序、中序、后序三种递归
*    遍历算法和层次遍历算法进行二叉树问题求解。
*    实验内容:
*        设计程序,实现如下功能:
*    1、输出二叉树b的结点个数
*    2、输出二叉树b的叶子结点个数
*    3、求二叉树b中指定结点值的结点的层次
*    4、利用层次遍历求二叉树b的宽度
*/

#include <stdio.h>
#include <malloc.h>

#define MAX_SIZE 100

typedef char ElemType;
typedef struct node
{
    ElemType data; // 数据元素
    struct node *lchild; // 指向左孩子结点
    struct node *rchild; // 指向右孩子结点
}BTNode; // 声明二叉链结点类型

/*-------------由括号表示串str创建二叉链b-----------------*/
static void create_btree(BTNode *&b, char *str) // 创建二叉树(形参b:指针的引用)
{
    BTNode *p;
    BTNode *St[MAX_SIZE]; // 定义一个顺序栈
    int k;
    int j = 0;
    int top = -1; // 栈顶指针初始化
    char ch;

    b = NULL; // 建立的二叉树初始时为空
    ch = str[j]; // 取第一个字符
    while(ch != '\0') // str未扫描完时循环
    {
        switch(ch)
        {
        case '(': // 开始处理左子树
            top++;
            St[top] = p;
            k = 1;
            break;
        case ')': // 子树处理完毕
            top--;
            break;
        case ',': // 开始处理右子树
            k = 2;
            break;
        default:
            p = (BTNode *)malloc(sizeof(BTNode)); // 动态分配结点p的存储空间
            p->data = ch;
            p->lchild = p->rchild = NULL;
            if(b == NULL) // 若b为空,p置为二叉树的根结点
                b = p;
            else // 已建立二叉树根结点
            {
                switch(k)
                {

在C语言中,我们可以使用递归的方式来二叉树的相关信息: 1. **节点总数**:对于每个节点,它可能是叶节点、左子节点、右子节点或者是根节点。计算节点总数时,需要对每个节点都计数一次。可以定义一个函数,例如`countNodes(node *root)`,该函数接收根节点作为参数,返回整个树的节点数。初始化为0,然后递归遍历所有子节点。 ```c int countNodes(node* root) { if (root == NULL) return 0; return 1 + countNodes(root->left) + countNodes(root->right); } ``` 2. **叶节点个数**:同样递归处理,如果节点没有孩子,则它是叶节点。在`countNodes`函数中添加一个检查条件即可。 ```c int leafCount(node* root) { if (root == NULL || (root->left == NULL && root->right == NULL)) return 1; return countNodes(root->left) + countNodes(root->right); } ``` 3. **某结点层次**:使用队列(广度优先搜索)可以帮助我们按层遍历二叉树,同时记录当前层的节点数量。当访问到目标节点时,它的层次就是队列长度减一。这里需要一个辅助函数`getNodeLevel(node *root, int targetNode, int level)`。 4. **二叉树宽度**(最大宽度):每次从上一层移向下一层时,记录当前层的最大节点数,因为宽度通常是指每一层的最大节点数。可以使用类似深度优先搜索的方法,每遇到新的一层就更新最大宽度。 ```c int maxWidth(node* root) { int maxWidth = 0, levelWidth[100] = {0}; // 假设最多有100层 queue<int> q; if (root != NULL) { q.push(1); // 根节点的层级为1 levelWidth[1] = 1; // 第1层只有一个节点 while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; ++i) { node* node = tree[q.front()]; q.pop(); if (node->left) q.push(node->left->level + 1); if (node->right) q.push(node->right->level + 1); levelWidth[node->level]++; maxWidth = MAX(maxWidth, levelWidth[node->level]); } } } return maxWidth; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值