L2-011玩转二叉树

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

// 根据中序遍历和前序遍历重建二叉树
TreeNode* buildTree(int* preorder, int preStart, int preEnd, int* inorder, int inStart, int inEnd) {
    if (preStart > preEnd || inStart > inEnd) return NULL;

    // 前序遍历的第一个节点是根节点
    
    int rootVal = preorder[preStart];
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->val = rootVal;
    root->left = root->right = NULL;

    // 在中序遍历中找到根节点的位置
    int rootIndex = inStart;
    while (inorder[rootIndex] != rootVal) rootIndex++;

    // 计算左子树的节点数量
    int leftTreeSize = rootIndex - inStart;

    // 递归构建左子树和右子树
    root->left = buildTree(preorder, preStart + 1, preStart + leftTreeSize, inorder, inStart, rootIndex - 1);
    root->right = buildTree(preorder, preStart + leftTreeSize + 1, preEnd, inorder, rootIndex + 1, inEnd);

    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 levelOrder(TreeNode* root) {
    if (root == NULL) return;

    // 使用队列实现层序遍历
    TreeNode* queue[100];
    int front = 0, rear = 0;
    queue[rear++] = root;//入队

    while (front < rear) {
        TreeNode* node = queue[front++];//出队
        printf("%d", node->val);

        if (node->left) queue[rear++] = node->left;
        if (node->right) queue[rear++] = node->right;

        if (front < rear) printf(" ");
    }
}

int main() {
    int N;
    scanf("%d", &N);

    int inorder[30], preorder[30];
    for (int i = 0; i < N; i++) scanf("%d", &inorder[i]);
    for (int i = 0; i < N; i++) scanf("%d", &preorder[i]);

    // 重建二叉树
    TreeNode* root = buildTree(preorder, 0, N - 1, inorder, 0, N - 1);

    // 镜面反转二叉树
    mirrorTree(root);

    // 输出反转后的层序遍历
    levelOrder(root);

    return 0;
}

全部评论

相关推荐

看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
湫湫湫不会java:1.在校经历全删了2.。这些荣誉其实也没啥用只能说,要的是好的开发者不是好好学生3.项目五六点就行了,一个亮点一俩行,xxx技术解决,xxx问题带来xxx提升。第一页学历不行,然后啥有价值的信息也没有,到第二页看到项目了,第一个项目九点,第二个项目像凑数的俩点。总体给人又臭又长,一起加油吧兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务