• 7-1 后序和中序构造二叉树


    分数 5

    作者 唐艳琴

    单位 中国人民解放军陆军工程大学

    本题目要求用后序序列和中序序列构造一棵二叉树(树中结点个数不超过10个),并输出其先序序列。

    输入格式:

    在第一行中输入元素个数。

    第二行中输入后序序列,用空格分隔。

    第三行中输入中序序列,用空格分隔。

    输出格式:

    输出此二叉树的先序序列,用空格分隔,最后也有一个空格。

    输入样例:

    1. 5
    2. 20 40 50 30 10
    3. 20 10 40 30 50

    输出样例:

    10 20 30 40 50 
    

    代码长度限制

    16 KB

    时间限制

    400 ms

    内存限制

    64 MB

    栈限制

    8192 KB

    C程序如下:

    1. #include
    2. #include
    3. // 定义二叉树节点结构体
    4. typedef struct BTree {
    5. int data; // 节点数据
    6. struct BTree* lchild, * rchild; // 左右子树指针
    7. } BTree, * Btree;
    8. // 函数声明
    9. Btree createInorder(int* post, int* mid, int n);
    10. void PreorderTravel(Btree tree);
    11. int main() {
    12. int n;
    13. // 输入节点数
    14. scanf("%d", &n);
    15. int post[n]; // 后序遍历数组
    16. int mid[n]; // 中序遍历数组
    17. // 输入后序遍历数组
    18. for (int i = 0; i < n; i++) {
    19. scanf("%d", &post[i]);
    20. }
    21. // 输入中序遍历数组
    22. for (int i = 0; i < n; i++) {
    23. scanf("%d", &mid[i]);
    24. }
    25. // 创建二叉树
    26. Btree root = createInorder(post, mid, n);
    27. // 先序遍历二叉树
    28. PreorderTravel(root);
    29. return 0;
    30. }
    31. // 根据后序和中序遍历数组创建二叉树
    32. Btree createInorder(int* post, int* mid, int n) {
    33. if (n == 0) {
    34. // 如果没有节点,返回 NULL
    35. return NULL;
    36. }
    37. if (n == 1) {
    38. // 如果只有一个节点,创建该节点并返回
    39. Btree root = (Btree)malloc(sizeof(BTree));
    40. root->data = post[0];
    41. root->lchild = NULL;
    42. root->rchild = NULL;
    43. return root;
    44. }
    45. int rootValue = post[n - 1]; // 后序遍历数组的最后一个元素是根节点
    46. int index = 0;
    47. // 在中序遍历数组中找到根节点的位置
    48. while (index < n && mid[index] != rootValue) {
    49. index++;
    50. }
    51. // 创建根节点
    52. Btree root = (Btree)malloc(sizeof(BTree));
    53. root->data = rootValue;
    54. // 递归创建左子树和右子树
    55. root->lchild = createInorder(post, mid, index);
    56. root->rchild = createInorder(post + index, mid + index + 1, n - index - 1);
    57. return root;
    58. }
    59. // 先序遍历二叉树并打印节点数据
    60. void PreorderTravel(Btree tree) {
    61. if (tree == NULL) {
    62. // 如果节点为空,返回
    63. return;
    64. }
    65. // 打印节点数据
    66. printf("%d ", tree->data);
    67. // 递归遍历左子树
    68. PreorderTravel(tree->lchild);
    69. // 递归遍历右子树
    70. PreorderTravel(tree->rchild);
    71. }

  • 相关阅读:
    win10系统任务栏图标变成白色的解决办法
    接口(interface)
    新课程标准培养学生“高考物理关键能力”的实践研究课题文献综述
    SpringCloud(5):Ribbon详解
    svn(乌龟svn)和SVN-VS2022插件(visualsvn) 下载
    收银系统十大排名(2023年十大收银软件品牌排行榜)
    List append 和 += 的区别
    linux常用命令收集
    MySQL安全性策略:用户认证与数据加密
    SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读
  • 原文地址:https://blog.csdn.net/2302_80325489/article/details/139639685