C语言:若用二又链表作为二叉树的存储表示,以二又树根为参数,试编写针对以下问题递归算法: (1)统计二叉树中非叶子结点的个数 2)交换每个结点的左孩子和右孩子
时间: 2024-11-15 10:28:40 浏览: 6
数据结构与算法基础课程 C语言C++程序语言设计教程 6_1二叉树 共19页.pptx
在C语言中,对于二叉树的存储表示通常采用链式结构,其中二叉链表包含节点结构,每个节点有指向左右孩子的指针。要针对这些问题编写递归算法,首先我们需要定义一个通用的节点结构,例如:
```c
typedef struct TreeNode {
int data; // 节点值
struct TreeNode* left; // 左孩子指针
struct TreeNode* right; // 右孩子指针
} Node;
```
以下是递归算法的实现:
1. 统计非叶子节点的数量(即含左右子节点的节点)
```c
int countNonLeafNodes(Node* root) {
if (root == NULL) return 0; // 空节点返回0
else {
// 如果节点不是叶子节点(有左右子节点),则加1
int nonLeaf = 1 + countNonLeafNodes(root->left) + countNonLeafNodes(root->right);
return nonLeaf;
}
}
```
2. 交换每个节点的左孩子和右孩子
```c
void swapChildren(Node* node) {
if (node != NULL) { // 非空节点交换
Node* temp = node->left;
node->left = node->right;
node->right = temp;
// 递归交换左、右子节点
swapChildren(node->left); // 左孩子
swapChildren(node->right); // 右孩子
}
}
```
使用这两个函数,你可以分别对给定的二叉树进行统计和修改:
```c
Node* yourTreeRoot; // 你的二叉链表根节点
countNonLeafNodes(yourTreeRoot);
swapChildren(yourTreeRoot);
```
阅读全文