```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建新节点 TreeNode* newNode(int val) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 翻转二叉树 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); } // 先序遍历 void preOrder(TreeNode* root, int* result, int* index) { if (root == NULL) { return; } result[(*index)++] = root->val; // 记录当前节点值 preOrder(root->left, result, index); // 遍历左子树 preOrder(root->right, result, index); // 遍历右子树 } int main() { int t; scanf("%d", &t); while (t--) { int n, d; scanf("%d %d", &n, &d); // 动态分配数组存储每一层的节点值 int a = (int)malloc(d * sizeof(int*)); for (int i = 0; i < d; i++) { a[i] = (int*)malloc((1 << i) * sizeof(int)); for (int j = 0; j < (1 << i); j++) { scanf("%d", &a[i][j]); } } // 构建二叉树 TreeNode nodes = (TreeNode)malloc(n * sizeof(TreeNode*)); for (int i = 0; i < n; i++) { nodes[i] = NULL; } for (int i = 0; i < d; i++) { for (int j = 0; j < (1 << i); j++) { if (a[i][j] != -1) { if (nodes[a[i][j] - 1] == NULL) { nodes[a[i][j] - 1] = newNode(a[i][j]); } if (i + 1 < d) { if (a[i + 1][j * 2 - 1] != -1) { if (nodes[a[i + 1][j * 2 - 1] - 1] == NULL) { nodes[a[i + 1][j * 2 - 1] - 1] = newNode(a[i + 1][j * 2 - 1]); } nodes[a[i][j] - 1]->left = nodes[a[i + 1][j * 2 - 1] - 1]; } if (a[i + 1][j * 2] != -1) { if (nodes[a[i + 1][j * 2] - 1] == NULL) { nodes[a[i + 1][j * 2] - 1] = newNode(a[i + 1][j * 2]); } nodes[a[i][j] - 1]->right = nodes[a[i + 1][j * 2] - 1]; } } } } } // 翻转二叉树 invertTree(nodes[0]); // 先序遍历并输出结果 int* result = (int*)malloc(n * sizeof(int)); int index = 0; preOrder(nodes[0], result, &index); for (int i = 0; i < index; i++) { printf("%d", result[i]); if (i < index - 1) { printf(" "); } } printf("\n"); // 释放内存 for (int i = 0; i < d; i++) { free(a[i]); } free(a); free(nodes); free(result); } return 0; } ``` 额外需要注意的逻辑点 1. 内存管理:动态分配的内存需要在程序结束前释放,避免内存泄漏。 2. 边界条件:处理输入时要注意 `-1` 表示不存在的节点,构建树时要正确处理这种情况。 3. 输入输出格式:确保输出格式符合题目要求,特别是最后一个整数后面没有空格。 [2024-12-02 09:51:45 | AI写代码神器 | 1053点数解答]