用c语言实现题解代码,题目如下 现有一棵n个结点的二叉树(结点编号为从0到n-1,根结点为0号结点),求这棵二叉树的先序遍历序列。 输入描述 第一行一个整数n(1≤n≤50),表示二叉树的结点个数; 接下来n行,每行一个结点,按顺序给出编号从0到n-1的结点的左子结点编号和右子结点编号,中间用空格隔开。如果不存在对应的子结点,那么用-1表示。 输出描述 输出n个整数,表示先序遍历序列,中间用空格隔开,行末不允许有多余的空格。 样例输入1 6 2 5 -1 -1 1 4 -1 -1 -1 -1 -1 3 样例输出1 0 2 1 4 5 3
时间: 2024-02-23 20:01:39 浏览: 129
以下是用C语言实现题目要求的代码,供参考:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 50
int preorder[MAX_N];
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
void preorderTraversal(TreeNode* root, int* preorder, int* index) {
if (root == NULL) {
return;
}
preorder[*index] = root->val;
(*index)++;
preorderTraversal(root->left, preorder, index);
preorderTraversal(root->right, preorder, index);
}
int main() {
int n;
scanf("%d", &n);
int* left = (int*)malloc(n * sizeof(int));
int* right = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d%d", &left[i], &right[i]);
}
TreeNode** nodes = (TreeNode**)malloc(n * sizeof(TreeNode*));
for (int i = 0; i < n; i++) {
nodes[i] = (TreeNode*)malloc(sizeof(TreeNode));
nodes[i]->val = i;
nodes[i]->left = NULL;
nodes[i]->right = NULL;
}
for (int i = 0; i < n; i++) {
if (left[i] != -1) {
nodes[i]->left = nodes[left[i]];
}
if (right[i] != -1) {
nodes[i]->right = nodes[right[i]];
}
}
int index = 0;
preorderTraversal(nodes[0], preorder, &index);
for (int i = 0; i < n; i++) {
printf("%d", preorder[i]);
if (i != n - 1) {
printf(" ");
}
}
printf("\n");
return 0;
}
```
代码思路:
1. 定义结构体`TreeNode`表示二叉树的结点,包含结点值`val`、左子结点`left`和右子结点`right`。
2. 定义函数`preorderTraversal`表示二叉树的先序遍历,其中`root`表示当前遍历到的结点,`preorder`表示先序遍历的结果,`index`表示`preorder`数组的下标。
3. 在`preorderTraversal`函数中,将当前结点的值加入`preorder`数组,并递归遍历左子树和右子树。
4. 在`main`函数中,读入二叉树的结点个数`n`及每个结点的左子结点编号和右子结点编号。
5. 动态分配`n`个`TreeNode`结点,并将每个结点的`val`赋值为结点编号。
6. 将每个结点的左子结点和右子结点指向对应的结点。
7. 调用`preorderTraversal`函数进行先序遍历,将结果存入`preorder`数组。
8. 输出`preorder`数组的结果。
代码复杂度:
时间复杂度:$O(n)$,其中$n$表示二叉树的结点个数,需要遍历所有结点。
空间复杂度:$O(n)$,需要动态分配$n$个`TreeNode`结构体和$n$个整型数组。
阅读全文