假设二叉树采用二叉链存储结构存储,试设计一个算法,计算一棵给定二叉树的所有单分支节点个数。
算法设计:
首先,遍历二叉树的每个节点,如果该节点只有一个孩子节点且另一个节点为空,则该节点为单分支节点。
具体实现:
定义一个函数,传入二叉树的根节点指针,返回单分支节点的数量。在函数内部实现二叉树的前序遍历,当遍历到节点只有一个孩子节点时,判断该孩子节点是否为空,若为空则该节点为单分支节点。递归遍历左右子树,将每个节点的判断结果累加到单分支节点的数量上。
代码实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* left;
struct node* right;
}Node;
int countSingleNode(Node* root) {
int count = 0;
if (root == NULL) {
return count;
}
if (root->left == NULL && root->right != NULL) {
count++;
}
if (root->right == NULL && root->left != NULL) {
count++;
}
count += countSingleNode(root->left);
count += countSingleNode(root->right);
return count;
}
int main() {
//构建二叉树
Node* root = (Node*)malloc(sizeof(Node));
root->data = 1;
root->left = (Node*)malloc(sizeof(Node));
root->left->data = 2;
root->left->left = NULL; //2号节点为单分支节点
root->left->right = NULL;
root->right = (Node*)malloc(sizeof(Node));
root->right->data = 3;
root->right->left = (Node*)malloc(sizeof(Node));
root->right->left->data = 4;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right = NULL; //左子树的4号节点为单分支节点
int count = countSingleNode(root);
printf("The count of single node is %d\n", count);
return 0;
}