原题链接:树的中序遍历
解题思路:
注意事项:
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复