c语言实现二叉树中所有结点的左、右子树相互交换。请给出详细的思路和完整代码
时间: 2024-12-11 15:19:35 浏览: 47
要在C语言中实现二叉树中所有节点的左右子树相互交换,我们需要遍历整个二叉树并对每个节点执行以下操作:
1. 检查当前节点是否存在左孩子(left)和右孩子(right)。
2. 如果存在左孩子,交换其与右孩子的值。
3. 如果存在右孩子,交换其与左孩子的值。
以下是C语言的一个示例实现,这里我们假设有一个简单的二叉树结构定义和递归遍历的方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode)
return NULL;
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// 左右子树互换
void swapChildren(Node** node) {
if (*node != NULL) {
if ((*node)->left != NULL && (*node)->right != NULL) {
int temp = (*node)->left->data;
(*node)->left->data = (*node)->right->data;
(*node)->right->data = temp;
}
swapChildren(&(*node)->left);
swapChildren(&(*node)->right);
}
}
// 中序遍历打印节点
void inorderTraversal(Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
int main() {
// 假设已有的二叉树实例...
Node* root = createNode(1); // 根节点
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
printf("Original tree before swapping:\n");
inorderTraversal(root);
// 调用函数交换左右子树
swapChildren(&root);
printf("\nTree after swapping:\n");
inorderTraversal(root);
return 0;
}
```
在这个代码中,`swapChildren` 函数用于递归地遍历并交换每个节点的左右子树。`inorderTraversal` 是一个辅助函数,用于中序遍历显示结果。
阅读全文