3.算法设计题,用c语言 以二叉链表作为二叉树的存储结构,设计以下算法。 ()统计二叉树的叶结点个数。 (2了判别两棵树是否相等。 ③交换二叉树每个结点的左孩子和右孩子。
时间: 2024-11-22 22:47:59 浏览: 0
在C语言中,我们可以使用递归的方式来解决这些问题,因为二叉树的性质非常适合递归操作。
1. **统计二叉树的叶节点个数**:
```c
int countLeaves(struct Node* root) {
if (root == NULL)
return 0;
else if (root->left == NULL && root->right == NULL) // 如果当前节点是叶子节点
return 1 + countLeaves(root->left) + countLeaves(root->right);
else
return countLeaves(root->left) + countLeaves(root->right); // 否则递归遍历左右子树
}
```
这里的`struct Node* root`是指向根节点的指针,函数会返回整个二叉树的叶节点数目。
2. **判断两棵二叉树是否相等**:
```c
int areTreesEqual(struct Node* node1, struct Node* node2) {
if (node1 == NULL && node2 == NULL)
return 1; // 都为空,表示相等
if (node1 == NULL || node2 == NULL)
return 0; // 有一个为空,表示不等
return (node1->val == node2->val && areTreesEqual(node1->left, node2->left) && areTreesEqual(node1->right, node2->right));
}
```
这个函数通过比较两个节点的值以及它们的子树是否相等来进行判断。
3. **交换二叉树每个结点的左孩子和右孩子**:
```c
void swapChildren(struct Node* node) {
if (node != NULL) {
struct Node* temp = node->left;
node->left = node->right;
node->right = temp;
// 递归地交换左、右孩子的值
swapChildren(node->left);
swapChildren(node->right);
}
}
```
这个`swapChildren`函数通过临时变量交换节点的左右孩子,并对每个子节点继续递归调用该函数。
阅读全文