c语言交换一个二叉树结点的左右子树
时间: 2024-10-26 19:17:53 浏览: 73
在C语言中,交换一个二叉树节点的左右子树通常涉及到对指针的巧妙操作。对于非空的二叉树节点`node`,你可以通过临时变量存储原左子节点,然后将左子节点指向原右子节点,最后将右子节点指向临时存储的左子节点。这里是一个简单的示例:
```c
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
void swapLeftAndRight(struct TreeNode *node) {
if (node == NULL || node->left == NULL || node->right == NULL) {
return; // 如果节点为空或者其中一个子节点为空,无需交换
}
// 创建临时存储节点
struct TreeNode* temp = node->left;
// 修改节点的左右子节点
node->left = node->right;
node->right = temp;
}
```
这个函数接受一个二叉树节点作为输入,如果节点及其子节点都存在,则会完成左右子节点的交换。注意,这个操作假设二叉树的结构是有效的,并且不会改变其他部分的结构。
相关问题
C语言数据结构实现二叉树遍历运算的应用:求二叉树中叶结点个数、结点总数、二叉树的高度,交换二叉树的左右子树
C语言中,二叉树是一种常见的数据结构,用于许多算法和应用中,包括搜索、排序等。以下是使用二叉树遍历来解决一些常见任务:
1. **计算叶节点个数**:
- 中序遍历可以方便地统计叶节点(没有子节点的节点),因为中序遍历对于每个节点,会先访问左子树,然后是节点自身,最后是右子树。如果节点是叶节点,则不会进入其子树,所以遇到这样的节点就加1。
2. **计算结点总数**:
- 对于所有节点进行深度优先遍历(如前序、中序或后序),每访问到一个节点就计数加一,最终得到的就是总节点数。
3. **计算二叉树高度**:
- 可以采用递归的方式计算,对于任意节点,它的高度等于左右子树的最大高度加上1。首先从根节点开始,递归地求左右子树的高度,返回较大者加1即可。
4. **交换二叉树的左右子树**:
- 遍历整棵树,对每一个节点,将它的左子树指针指向原右子树,再将右子树指针指向原左子树。这个操作可以在中序遍历时完成,因为此时节点还未插入子节点,直接修改指针即可。
下面是简单的伪代码示例:
```c
int countLeaves(Node* root) {
if (root == NULL)
return 0;
else if (root->left == NULL && root->right == NULL)
return 1; // 叶节点
else
return countLeaves(root->left) + countLeaves(root->right);
}
int countNodes(Node* root) {
if (root == NULL)
return 0;
else
return 1 + countNodes(root->left) + countNodes(root->right);
}
int height(Node* root) {
if (root == NULL)
return 0;
else {
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
}
void swapChildren(Node* node) {
if (node != NULL) {
Node* temp = node->left;
node->left = node->right;
node->right = temp;
}
}
```
用c语言写 交换二叉树中所有结点的左右子树
以下是用C语言实现交换二叉树中所有节点的左右子树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 交换二叉树中所有节点的左右子树
void invertTree(TreeNode* root) {
if (root == NULL) {
return;
}
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
invertTree(root->left);
invertTree(root->right);
}
// 创建二叉树
TreeNode* createTree(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 打印二叉树(按照中序遍历的顺序)
void printTree(TreeNode* root) {
if (root == NULL) {
return;
}
printTree(root->left);
printf("%d ", root->val);
printTree(root->right);
}
int main() {
// 创建二叉树
TreeNode* root = createTree(4);
root->left = createTree(2);
root->right = createTree(7);
root->left->left = createTree(1);
root->left->right = createTree(3);
root->right->left = createTree(6);
root->right->right = createTree(9);
printf("Original binary tree: ");
printTree(root);
// 交换二叉树中所有节点的左右子树
invertTree(root);
printf("\nBinary tree after inversion: ");
printTree(root);
return 0;
}
```
输出:
```
Original binary tree: 1 2 3 4 6 7 9
Binary tree after inversion: 9 7 6 4 3 2 1
```
该代码首先定义了二叉树结点的结构体,然后定义了交换二叉树中所有节点的左右子树函数`invertTree`。该函数递归交换每个节点的左右子树,直到遍历完整个二叉树。
接着,该代码定义了创建二叉树的函数`createTree`和打印二叉树的函数`printTree`。在`main`函数中,我们创建了一棵二叉树,并且分别在交换前和交换后打印出了二叉树的中序遍历结果。
阅读全文