用c写出以下问题的代码,树的遍历 Description 给定一棵满二叉树树先序遍历的输出结果,求该树中序遍历的输出结果。 Input 2^n - 1个数字(n是≤16的正整数),每个数字的取值范围[0, 255], 数字之间用逗号分割。 Output 树的中序遍历结果,数字之间通过逗号分割。 Sample Input 1 1,2,3,4,5,6,7 Sample Output 1 3,2,4,1,6,5,7
时间: 2023-04-04 07:01:59 浏览: 107
以下是用 C 语言写出该问题的代码:
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 根据先序遍历结果构建二叉树
TreeNode* buildTree(int* preorder, int start, int end) {
if (start > end) {
return NULL;
}
// 创建根节点
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = preorder[start];
root->left = NULL;
root->right = NULL;
if (start == end) {
return root;
}
// 找到左右子树的分界点
int mid = start + 1;
while (mid <= end && preorder[mid] < preorder[start]) {
mid++;
}
// 递归构建左右子树
root->left = buildTree(preorder, start + 1, mid - 1);
root->right = buildTree(preorder, mid, end);
return root;
}
// 中序遍历二叉树
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d,", root->val);
inorderTraversal(root->right);
}
int main() {
int n;
scanf("%d", &n);
int* preorder = (int*)malloc(sizeof(int) * (1 << n) - 1);
for (int i = ; i < (1 << n) - 1; i++) {
scanf("%d,", &preorder[i]);
}
TreeNode* root = buildTree(preorder, , (1 << n) - 2);
inorderTraversal(root);
return ;
}
阅读全文