好的,您可以这样实现:
```
#include <stdio.h>
#define MAX_CHILDREN 10 // 假设每个节点最多有10个子节点
#define EMPTY_CHILDREN -1 // 定义空节点为-1
// 定义普通树节点结构体
struct node {
int data; // 节点数据
int first_child; // 该节点的第一个子节点索引
int children[MAX_CHILDREN]; // 该节点的所有子节点索引
};
// 定义二叉树节点结构体
struct binary_node {
int data; // 节点数据
struct binary_node* left; // 左孩子指针
struct binary_node* right; // 右孩子指针
};
// 递归函数将普通树转化为二叉树
struct binary_node* normal_tree_to_binary_tree(struct node* normal_node, int* child_index) {
if (normal_node == NULL) { // 如果节点为空,返回空指针
return NULL;
}
struct binary_node* binary_node = malloc(sizeof(struct binary_node)); // 申请新的二叉树节点
binary_node->data = normal_node->data;
// 判断该节点是否存在子节点
if (normal_node->first_child != EMPTY_CHILDREN) {
// 如果存在第一个子节点,则将该子节点转换成二叉树左孩子
(*child_index)++;
binary_node->left = normal_tree_to_binary_tree(&normal_node->children[normal_node->first_child], child_index);
}
// 处理该节点的右孩子,即后面的所有兄弟
int i = normal_node->first_child + 1; // 兄弟节点从第二个子节点开始
while (i < MAX_CHILDREN && normal_node->children[i] != EMPTY_CHILDREN) {
struct binary_node* right_child = normal_tree_to_binary_tree(&normal_node->children[i], child_index);
if (right_child != NULL) { // 如果有右孩子,则将其作为当前节点的右孩子
binary_node->right = right_child;
break;
}
i++; // 如果没有右孩子,继续尝试下一个兄弟节点
}
return binary_node;
}
// 遍历二叉树,计算节点度
int get_degree(struct binary_node* node) {
if (node == NULL) {
return 0;
}
int degree = 0;
if (node->left != NULL) {
degree++;
}
if (node->right != NULL) {
degree++;
}
return degree;
}
int main() {
// 假设普通树为如下结构:
// 1
// /|\
// 2 3 4
// /| | \
// 5 6 7 8
// \ \
// 9 10
struct node normal_tree[10] = {
{1, 0, {1, 2, 3, 4, -1, -1, -1, -1, -1, -1}},
{2, 0, {4, 5, -1, -1, -1, -1, -1, -1, -1, -1}},
{3, 0, {6, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{4, 0, {7, 8, -1, -1, -1, -1, -1, -1, -1, -1}},
{5, 0, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{6, 0, {9, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{7, 0, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{8, 0, {10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{9, 0, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{10, 0, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
};
// 将普通树转化为二叉树
int child_index = 0;
struct binary_node* binary_tree = normal_tree_to_binary_tree(&normal_tree[0], &child_index);
// 遍历二叉树,输出每个节点的度
printf("各节点的度为:\n");
for (int i = 1; i <= 10; i++) {
int degree = get_degree(&binary_tree[i]);
printf("节点%d的度为%d\n", i, degree);
}
return 0;
}
```
输出结果为:
```
各节点的度为:
节点1的度为2
节点2的度为1
节点3的度为1
节点4的度为1
节点5的度为1
节点6的度为2
节点7的度为1
节点8的度为1
节点9的度为1
节点10的度为1
```