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

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

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 来计算每一层的节点数,从而得到二叉树的宽度。

相关文章
|
6天前
|
存储 算法 程序员
【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和
【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和
45 0
|
6天前
|
Java C++ Python
leetcode-538:把二叉搜索树转换为累加树
leetcode-538:把二叉搜索树转换为累加树
22 0
|
6天前
|
机器学习/深度学习 C++
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
|
6天前
|
算法
二叉树的结点个数、叶子结点个数的代码实现<分治算法>
二叉树的结点个数、叶子结点个数的代码实现<分治算法>
|
11月前
|
算法 安全
二叉树的基本操作(如何计算二叉树的结点个数,二叉树的高度)
二叉树的基本操作(如何计算二叉树的结点个数,二叉树的高度)
182 0
|
11月前
|
Python
Python实现统计二叉树叶子结点个数
Python实现统计二叉树叶子结点个数
148 0
|
C语言
代码实现求二叉树结点数和叶子结点数(C语言)
代码实现求二叉树结点数和叶子结点数(C语言)
479 0
代码实现求二叉树结点数和叶子结点数(C语言)
LeetCode 538. 把二叉搜索树转换为累加树
LeetCode 538. 把二叉搜索树转换为累加树
136 0
LeetCode 538. 把二叉搜索树转换为累加树
leetcode 538把二叉搜索树转换为累加树
leetcode 538把二叉搜索树转换为累加树
53 0
leetcode 538把二叉搜索树转换为累加树
代码随想录刷题|LeetCode 513. 找树左下角的值 112. 路径总和 113.路径总和|| 106. 从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
代码随想录刷题|LeetCode 513. 找树左下角的值 112. 路径总和 113.路径总和|| 106. 从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
代码随想录刷题|LeetCode 513. 找树左下角的值 112. 路径总和 113.路径总和|| 106. 从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树