递归方法来计算二叉树的双分支节点个数

1.递归方法来计算二叉树的双分支节点个数

首先,你需要定义二叉树的节点结构,然后编写递归函数

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树的节点结构
struct TreeNode {
    int value;
    struct TreeNode* left;
    struct TreeNode* right;
};

// 创建新节点的函数
struct TreeNode* createNode(int value) {
    struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    newNode->value = value;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 递归求解二叉树双分支节点个数的函数
int countDoubleBranchNodes(struct TreeNode* root) {
    if (root == NULL) {
        return 0;
    }

    // 判断当前节点是否为双分支节点
    int isDoubleBranch = (root->left != NULL && root->right != NULL);

    // 递归计算左右子树的双分支节点个数
    int leftCount = countDoubleBranchNodes(root->left);
    int rightCount = countDoubleBranchNodes(root->right);

    // 返回左右子树的双分支节点个数之和,加上当前节点的贡献
    return leftCount + rightCount + (isDoubleBranch ? 1 : 0);
}

// 主函数
int main() {
    // 构建一个二叉树
    //        1
    //       / \
    //      2   3
    //     / \
    //    4   5
    struct TreeNode* root = createNode(1);
    root->left = createNode(2);
    root->right = createNode(3);
    root->left->left = createNode(4);
    root->left->right = createNode(5);

    // 计算双分支节点个数
    int result = countDoubleBranchNodes(root);
    printf("双分支节点个数: %d\n", result);

    // 释放动态分配的内存
    // 在实际应用中,确保释放分配的内存是很重要的
    // 此处为简化示例,没有包含详细的内存释放操作
    return 0;
}

2.C语言递归计算二叉树是否含有值为x的结点

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// 创建新节点
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 递归搜索二叉树中是否包含值为x的节点
int containsNode(struct Node* root, int x) {
    // 如果当前节点为空,返回0(未找到)
    if (root == NULL) {
        return 0;
    }

    // 如果当前节点的值等于x,返回1(找到了)
    if (root->data == x) {
        return 1;
    }

    // 递归搜索左子树和右子树
    int leftResult = containsNode(root->left, x);
    int rightResult = containsNode(root->right, x);

    // 返回左子树或右子树中是否找到了值为x的节点
    return leftResult || rightResult;
}

int main() {
    // 创建二叉树
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);

    // 搜索值为x的节点
    int x = 3;
    if (containsNode(root, x)) {
        printf("二叉树中包含值为 %d 的节点。\n", x);
    } else {
        printf("二叉树中不包含值为 %d 的节点。\n", x);
    }

    return 0;
}

3.计算二叉树的高度

计算二叉树的高度和宽度可以通过递归的方式来实现。高度表示从根节点到最远叶子节点的最长路径长度,而宽度表示二叉树每一层的节点数的最大值。

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// 创建新节点
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 计算二叉树的高度(最大深度)
int getHeight(struct Node* root) {
    if (root == NULL) {
        return 0;
    } else {
        int leftHeight = getHeight(root->left);
        int rightHeight = getHeight(root->right);

        // 返回左右子树中的最大高度并加上根节点
        return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1);
    }
}

int main() {
    // 创建二叉树
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    root->right->left = newNode(6);
    root->right->right = newNode(7);

    // 计算二叉树的高度
    int height = getHeight(root);
    printf("二叉树的高度是: %d\n", height);

    return 0;
}

4.计算二叉树的宽度

要计算二叉树的宽度,可以通过层序遍历(广度优先搜索)的方式,记录每一层节点的数量,并找到最大的层的节点数。

这里提供一个计算二叉树宽度的函数:

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// 创建新节点
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 获取二叉树的高度
int getHeight(struct Node* root) {
    if (root == NULL) {
        return 0;
    } else {
        int leftHeight = getHeight(root->left);
        int rightHeight = getHeight(root->right);
        return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1);
    }
}

// 辅助函数:递归地计算每一层的节点数
void getWidthRecursive(struct Node* root, int level, int* count) {
    if (root == NULL) {
        return;
    }

    if (level == 1) {
        (*count)++;
    } else if (level > 1) {
        getWidthRecursive(root->left, level - 1, count);
        getWidthRecursive(root->right, level - 1, count);
    }
}

// 计算二叉树的宽度
int getWidth(struct Node* root) {
    int maxWidth = 0;
    int height = getHeight(root);
    for (int i = 1; i <= height; i++) {
        int count = 0;
        getWidthRecursive(root, i, &count);
        if (count > maxWidth) {
            maxWidth = count;
        }
    }
    return maxWidth;
}

int main() {
    // 创建二叉树
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    root->right->left = newNode(6);
    root->right->right = newNode(7);

    // 计算二叉树的宽度
    int width = getWidth(root);
    printf("二叉树的宽度是: %d\n", width);

    return 0;
}

 这两个示例展示了如何使用递归方法计算二叉树的高度和宽度。函数 getHeight 用于计算二叉树的高度,而 getWidth 函数则使用辅助函数 getWidthRecursive 来计算每一层的节点数,从而得到二叉树的宽度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是用 C 语言实现二叉树中叶子节点、单分支节点分支节点个数的代码: ```c #include <stdio.h> #include <stdlib.h> // 二叉树结点定义 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建二叉树 TreeNode *createBinaryTree() { TreeNode *root = NULL; int val; scanf("%d", &val); if (val != -1) { root = (TreeNode *)malloc(sizeof(TreeNode)); root->val = val; root->left = createBinaryTree(); root->right = createBinaryTree(); } return root; } // 统计叶子节点数 int countLeafNodes(TreeNode *root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { return 1; } return countLeafNodes(root->left) + countLeafNodes(root->right); } // 统计单分支结点数 int countSingleBranchNodes(TreeNode *root) { if (root == NULL || (root->left == NULL && root->right == NULL)) { return 0; } if (root->left == NULL || root->right == NULL) { return 1 + countSingleBranchNodes(root->left) + countSingleBranchNodes(root->right); } return countSingleBranchNodes(root->left) + countSingleBranchNodes(root->right); } // 统计分支结点数 int countDoubleBranchNodes(TreeNode *root) { if (root == NULL || (root->left == NULL && root->right == NULL)) { return 0; } if (root->left != NULL && root->right != NULL) { return 1 + countDoubleBranchNodes(root->left) + countDoubleBranchNodes(root->right); } return countDoubleBranchNodes(root->left) + countDoubleBranchNodes(root->right); } int main() { // 创建二叉树 printf("请输入二叉树的结点(-1表示空结点):\n"); TreeNode *root = createBinaryTree(); // 统计节点数 int leafNodes = countLeafNodes(root); int singleBranchNodes = countSingleBranchNodes(root); int doubleBranchNodes = countDoubleBranchNodes(root); // 输出结果 printf("叶子结点个数:%d\n", leafNodes); printf("单分支结点个数:%d\n", singleBranchNodes); printf("分支结点个数:%d\n", doubleBranchNodes); return 0; } ``` 在上面的代码中,我们先定义了一个二叉树的结点,包含一个整数值和左右两个子节点。然后通过递归的方式创建二叉树,统计叶子节点数、单分支节点数和分支节点数。最后输出结果。 希望这个代码可以帮到你!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西柚与蓝莓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值