假设以二叉链作为存储结构,设计一个算法求二叉树中单分支结点的个数用c语言写
时间: 2024-12-11 21:40:48 浏览: 11
在C语言中,我们可以使用递归的方式来遍历二叉树并统计单分支节点(即只有一个孩子的节点)。这里假设我们有一个二叉链表结构,每个节点包含一个值`val`、一个指向左孩子的指针`left`和一个指向右孩子的指针`right`。
```c
#include <stdio.h>
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
int countSingleChildNodes(TreeNode* root) {
// 如果根节点为空,则直接返回0
if (root == NULL) {
return 0;
}
// 如果根节点只有一个孩子,则返回1,表示单分支节点
if (root->left == NULL && root->right == NULL) {
return 1;
}
// 递归处理左右子树,将左右子树的单分支节点数相加
int leftCount = (root->left != NULL) ? countSingleChildNodes(root->left) : 0;
int rightCount = (root->right != NULL) ? countSingleChildNodes(root->right) : 0;
// 返回当前节点加上左右子树的单分支节点数
return leftCount + rightCount + (root->left == NULL && root->right == NULL);
}
// 示例用法
int main() {
// 初始化一个二叉树
TreeNode* tree = ...; // 填充实际的二叉树节点
int singleBranchCount = countSingleChildNodes(tree);
printf("单分支节点的个数: %d\n", singleBranchCount);
return 0;
}
```
这个算法的时间复杂度是O(n),其中n是二叉树的节点总数,因为我们对每一个节点都只访问一次。空间复杂度是O(h),h是树的高度,最坏情况下(完全不平衡的树),等于树的深度。
阅读全文