玩转二叉树

镜面反转二叉树并进行层序遍历的 C++ 代码如下:

#include <iostream>

#include <vector>

#include <queue>

 

using namespace std;

 

// 定义二叉树的结构体

struct TreeNode {

    int val;

    TreeNode* left;

    TreeNode* right;

};

 

// 创建二叉树节点

TreeNode* createNode(int val) {

    TreeNode* newNode = new TreeNode();

    newNode->val = val;

    newNode->left = NULL;

    newNode->right = NULL;

    return newNode;

}

 

// 打印二叉树

void printTree(TreeNode* root) {

    if (root == NULL) {

        return;

    }

    printTree(root->left);

    cout << root->val << " ";

    printTree(root->right);

}

 

// 构建二叉树

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int start, int end) {

    if (start > end) {

        return NULL;

    }

 

    // 在 preorder 中找到当前节点的值

    int val = preorder[start - 1];

 

    // 在 inorder 中找到当前节点的索引

    int inorderIndex = start;

    while (inorder[inorderIndex] != val) {

        inorderIndex++;

    }

 

    // 构建左子树

    TreeNode* left = buildTree(preorder, inorder, start, inorderIndex - 1);

 

    // 构建右子树

    TreeNode* right = buildTree(preorder, inorder, inorderIndex + 1, end);

 

    // 创建当前节点

    TreeNode* root = createNode(val);

    root->left = left;

    root->right = right;

 

    return root;

}

 

// 镜面反转二叉树

void mirrorTree(TreeNode* root) {

    if (root == NULL) {

        return;

    }

 

    // 交换左子树和右子树

    TreeNode* temp = root->left;

    root->left = root->right;

    root->right = temp;

 

    // 递归反转左子树和右子树

    mirrorTree(root->left);

    mirrorTree(root->right);

}

 

// 层序遍历二叉树

void levelOrderTraversal(TreeNode* root) {

    if (root == NULL) {

        return;

    }

 

    // 创建一个队列,并将根节点入队

    queue<TreeNode*> queue;

    queue.push(root);

 

    // 层序遍历

    while (!queue.empty()) {

        int levelSize = queue.size();

 

        for (int i = 0; i < levelSize; i++) {

            TreeNode* current = queue.front();

            queue.pop();

 

            // 输出当前节点的值

            cout << current->val << " ";

 

            // 将当前节点的左右子节点入队

            if (current->left != NULL) {

                queue.push(current->left);

            }

            if (current->right != NULL) {

                queue.push(current->right);

            }

        }

        cout << endl;

    }

}

 

int main() {

    // 输入二叉树的节点个数

    int N;

    cin >> N;

 

    // 输入前序遍历序列

    vector<int> preorder;

    for (int i = 0; i < N; i++) {

        int val;

        cin >> val;

        preorder.push_back(val);

    }

 

    // 输入中序遍历序列

    vector<int> inorder;

    for (int i = 0; i < N; i++) {

        int val;

        cin >> val;

        inorder.push_back(val);

    }

 

    // 构建二叉树

    TreeNode* root = buildTree(preorder, inorder, 0, N - 1);

 

    // 打印原始二叉树

    cout << "原始二叉树: ";

    printTree(root);

 

    // 镜面反转二叉树

    mirrorTree(root);

 

    // 打印反转后的二叉树

    cout << "反转后的二叉树: ";

    printTree(root);

 

    // 层序遍历反转后的二叉树

    cout << "反转后的层序遍历: ";

    levelOrderTraversal(root);

 

    return 0;

}

 

 

在上述代码中,我们首先定义了一个 TreeNode 结构体,表示二叉树的节点。然后,我们实现了以下几个函数:

 

-  createNode :创建一个新的二叉树节点。

 

-  printTree :打印二叉树。

 

-  buildTree :根据前序遍历和中序遍历序列构建二叉树。

 

-  mirrorTree :镜面反转二叉树。

 

-  levelOrderTraversal :层序遍历二叉树。

 

在 main 函数中,我们首先输入二叉树的节点个数和前序遍历、中序遍历序列。然后,我们使用 buildTree 函数构建原始二叉树,并使用 printTree 函数打印原始二叉树。接下来,我们调用 mirrorTree 函数进行镜面反转,并使用 printTree 函数打印反转后的二叉树。最后,我们使用 levelOrderTraversal 函数进行层序遍历,并输出反转后的层序遍历结果。

 

希望这个示例对你有帮助。如果你有任何其他问题,请随时提问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值