原题链接:树的中序遍历
解题思路:
注意事项:
参考代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data; // 数据域
struct node *father; // 父结点指针
struct node *left, *right; // 左右孩子结点指针
} Node;
// 创建一个结点
Node *createNode(int data) {
Node *node = (Node *) malloc(sizeof(Node));
node->father = NULL;
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 递归中序遍历树结点
void inorderTransversal(Node *node) {
if (node == NULL) {
return;
}
inorderTransversal(node->left);
printf("%d ", node->data);
inorderTransversal(node->right);
}
int main() {
int n;
scanf("%d", &n);
// 存放树中所有结点的数组
Node *nodes[n + 1];
for (int i = 0; i < n + 1; i++) {
nodes[i] = NULL;
}
int li, ri;
for (int i = 1; i <= n; i++) {
// 当前的第i个结点为空
if (nodes[i] == NULL) {
nodes[i] = createNode(i);
}
scanf("%d %d", &li, &ri);
// 左结点不是0,且为空
if (li != 0 && nodes[li] == NULL) {
nodes[li] = createNode(li);
nodes[li]->father = nodes[i]; // 设置父结点指针,方便往上查找根节点
}
// 右结点不是0,且为空
if (ri != 0 && nodes[ri] == NULL) {
nodes[ri] = createNode(ri);
nodes[ri]->father = nodes[i];
}
// 设置当前结点的左右孩子结点
nodes[i]->left = nodes[li];
nodes[i]->right = nodes[ri];
}
// 获取二叉树中任一结点,找到树的根节点
Node *root = nodes[1];
while (root->father != NULL) {
root = root->father;
}
// 递归中序遍历
inorderTransversal(root);
// 释放树中所有结点
for (int i = 0; i < n + 1; i++) {
free(nodes[i]);
}
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复