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