c语言编写数据结构程序题:实现二叉树中所有结点的左、右子树相互交换。请先给出详细步骤和思路,然后给出完整代码
时间: 2024-11-09 15:24:34 浏览: 33
要实现二叉树中所有结点的左、右子树相互交换,我们可以采用深度优先搜索(DFS)策略。这里以中序遍历为基础,因为中序遍历的顺序是左子树 -> 根节点 -> 右子树,所以交换左右子树后,原来的左子树会变成右子树,原来的右子树会变成新的左子树。
**详细步骤和思路**:
1. **遍历二叉树**:从根节点开始,对每个节点执行以下操作:
a. 记录当前节点(`node`)
b. 如果节点不为空,则遍历左子树(`leftSwap(node)`),接着遍历右子树(`rightSwap(node)`)
c. 节点的左右子树交换,即 `node->left = node->right; node->right = node->left;`
2. **辅助函数**:
a. `leftSwap(node)`:如果节点不为空,递归地调用自身并更新左子节点。
b. `rightSwap(node)`:同理,但用于右子节点。
**C语言代码示例**:
```c
#include <stdio.h>
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 中序遍历辅助函数
void inorderTraversal(TreeNode* node) {
if (node != NULL) {
inorderTraversal(node->left);
printf("%d ", node->val); // 输出节点值
inorderTraversal(node->right);
}
}
// 交换左右子树
void swapChildren(TreeNode* node) {
if (node != NULL) {
// 先交换左右子节点指针
TreeNode* temp = node->left;
node->left = node->right;
node->right = temp;
// 递归调用自己,继续交换子树内的节点
swapChildren(node->left);
swapChildren(node->right);
}
}
int main() {
// 假设已构建好二叉树
TreeNode* root = ...;
// 执行交换操作
swapChildren(root);
// 验证交换后的中序遍历结果
inorderTraversal(root);
return 0;
}
```
阅读全文