c++假设二叉树采用二叉链存储结构,设计一个算法把二叉树 b 的左、右子树进行交换。要求不破坏原二叉树,并用相关数据进行测试。
时间: 2024-12-10 20:27:42 浏览: 11
在C++中,我们可以采用递归的方式来实现二叉树的左右子树交换。首先,我们需要定义一个`struct TreeNode`表示二叉树节点:
```cpp
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
```
接下来,我们可以编写一个名为`swapTreeNodes(TreeNode* &root)`的函数,该函数接收指向根节点的引用并对其进行操作:
```cpp
void swapTreeNodes(TreeNode *&root) {
if (root == nullptr || root->left == nullptr && root->right == nullptr) { // 如果当前节点为空或已经是叶子节点,无需交换
return;
}
// 首先将左子树移动到当前节点的位置
TreeNode *temp = root->left;
root->left = temp->right; // 左子树的新右指针
temp->right = root; // 新旧根节点指向彼此
// 然后递归处理原来的左子树(新根节点)
swapTreeNodes(root->left);
// 最后处理原来的右子树(原左子树现在变成了右子树)
swapTreeNodes(root);
}
```
为了测试这个函数,我们可以创建一个简单的二叉树实例,比如:
```cpp
TreeNode* buildTree() {
return new TreeNode(1) {
.left = new TreeNode(2),
.right = new TreeNode(3)
};
}
int main() {
TreeNode* tree = buildTree();
swapTreeNodes(tree); // 调用函数交换左右子树
// 打印交换后的树结构,检查是否正确
inorderTraversal(tree); // 自定义的中序遍历函数,用于打印节点值
// ...
delete tree; // 别忘了释放内存
return 0;
}
```
注意,这里的`inorderTraversal`是一个辅助函数,用于按照从左到右再到根的顺序遍历并打印节点值,你可以根据需要自定义。
阅读全文