C语言实现:二叉树左右翻转及翻转后先序遍历,详解输入输出与内存管理
```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. 输入输出格式:确保输出格式符合题目要求,特别是最后一个整数后面没有空格。 ######[AI写代码神器 | 1053点数解答 | 2024-12-02 09:51:45]
- C++实现整数“第二数位”翻转:代码详解与复杂度分析(字节豆包 | 462点数解答 | 2025-11-10 20:30:20)116
- C语言实现整数“第二数位”翻转:代码详解与复杂度分析(字节豆包 | 523点数解答 | 2025-11-10 19:54:57)99
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)380
- 工程师必备!10 种工程日常易用管理工具大揭秘(百度文心 | 346点数解答 | 2023-11-09 18:26:09)309
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)255
- Python实现:读入正整数后从大到小打印,代码详解!(字节豆包 | 165点数解答 | 2025-12-07 09:44:50)90
- Python求解n以内3的倍数:代码实现及开发注意事项 (字节豆包 | 222点数解答 | 2025-12-07 12:28:15)59
- C语言实现:无输入打印精美心形图案代码揭秘(DeepSeek | 72点数解答 | 2025-12-15 17:38:15)50
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)350
- JS 巧用 for in 循环逐行输出对象 key:value,还有关键判断!( | 208点数解答 | 2024-05-20 22:15:55)377
- C++实现顺序存储结构基本操作:初始化、插入、删除等全解析(GPT | 1743点数解答 | 2024-09-26 00:20:17)298
- Python知识大挑战:10 道题揭秘编程关键要点与答案(字节豆包 | 296点数解答 | 2024-10-20 19:31:00)243