由二叉树的前序和中序如何得到二叉树的后序呢?要给出答案,首先得明白什么是前序、中序、后序。

二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点

可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。

举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10

首先,5肯定是二叉树的根节点,然后5在中序里面的位置是3号(从0开始),此位置前面的是左子树中的节点,右面的是右子树的节点,即5 || 3 2 4 || 8 2 6 , 2 3 4 || 5 || 6 8 10,对红色的左子树序列、蓝色的右子树序列继续上述过程,直至结束。

由后序和中序求前序也是像类似的思想。但是仅仅知道前序和后序无法确定二叉的形状。比如前序 1 2 3 后序 3 2 1 则下面两种情况都符合

附二叉树前序和中序生成后序的代码

 1 //二叉树 前序和中序得到后序
 2 #include <stdio.h>
 3 typedef struct node
 4 {
 5     int key;
 6     struct node *left;
 7     struct node *right;
 8 }treeNode;
 9
10 int pre_order[100];
11 int mid_order[100];
12
13 treeNode* construct_post_order(int pre_l, int pre_r, int mid_l, int mid_r)
14 {
15     if (pre_r - pre_l < 0)
16     {
17         return NULL;
18     }
19     treeNode *root;
20     root = new treeNode;
21     root->key = pre_order[pre_l];
22     if (pre_r == pre_l)
23     {
24         root->left = NULL;
25         root->right = NULL;
26         return root;
27     }
28     int index;
29     for (index = mid_l; index <= mid_r; index++)
30     {
31         if (mid_order[index] == pre_order[pre_l])
32             break;
33     }
34     root->left = construct_post_order(pre_l+1, pre_l+(index-mid_l), mid_l, index-1);
35     root->right = construct_post_order(pre_l+(index-mid_l)+1, pre_r, index+1, mid_r);
36     return root;
37 }
38
39 void post_Order(treeNode *root)
40 {
41     if(root != NULL)
42     {
43         post_Order(root->left);
44         post_Order(root->right);
45         printf("%d ", root->key);
46     }
47 }
48
49 int main()
50 {
51     int n;
52     printf("输入序列的长度\n");
53     scanf("%d", &n);
54     printf("输入二叉树前序\n");
55     for (int i = 0; i < n; i++)
56         scanf("%d", &pre_order[i]);
57     printf("输入二叉树中序\n");
58     for (int i = 0; i < n; i++)
59         scanf("%d", &mid_order[i]);
60     treeNode *root = construct_post_order(0, n-1, 0, n-1);
61     printf("二叉树的后序为\n");
62     post_Order(root);
63     printf("\n");
64     scanf("%d", &n);
65
66     return 0;
67 }

转载地址: http://www.cnblogs.com/rain-lei/p/3576796.html

二叉树前序,中序转后序相关推荐

  1. 二叉树深度优先 java_二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历) java实现...

    二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历.由于树的 ...

  2. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)

    手动创建一棵二叉树,然后利用前序.中序.后序.层序进行遍历 import java.util.LinkedList; import java.util.List; import java.util.Q ...

  3. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  4. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  5. 二叉树前序中序后序_leetcode889_go_根据前序和后序遍历构造二叉树

    leetcode889_根据前序和后序遍历构造二叉树 01 - 题目 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值是不同的正整数. 示例:输入:pre = [1,2, ...

  6. 二叉树前序、中序、后序遍历求法

    二叉树前序.中序.后序遍历相互求法 二叉树的三种遍历方法: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序 ...

  7. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次) 转载陈小龙哈2017...

    http://blog.csdn.net/baidu_30000217/article/details/52953127 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点 ...

  8. 二叉树的前序、中序、后序遍历与创建

    #include <iostream> #include <string> #include <stack> using namespace std; struct ...

  9. leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析

    目录 1.106题目 2.参考思路:递归切割数组 3.105题目 4.同样思路的代码 1.106题目 2.参考思路:递归切割数组 代码参考:公众号:代码随想录 后序数组+中序数组 以 后序数组(左右中 ...

  10. 数据结构 - 二叉树(前序中序后序查找)

    public static int i = 1, j = 1, k =1;//编写前序查找方法public HeroNode preOrderSearch(int no){System.out.pri ...

最新文章

  1. WinForm窗体设置
  2. 中运用_胶水在木雕中的运用技巧
  3. HDU 2833 WuKong
  4. wxWidgets:wxScrolled 示例
  5. C++爬虫项目爬取图片
  6. java底层机制_Java同步机制的底层实现
  7. python csv合并单元格_python中合并表格的两种方法
  8. android 动画xml属性总结
  9. 论文笔记_S2D.09-2018-ECCV_从RGB和稀疏感知估计深度
  10. python 运算符及 字符串格式化输出方式 if条件语句判断 random函数简单应用练习
  11. 成功创业者培养的四个习惯
  12. LaTex 符号大全
  13. 太实用了,这几个Python数据可视化案例
  14. java实现识别二维码图片功能
  15. SpringBoot整合Minio实现文件上传、下载
  16. Basset: learning the regulatory code of the accessible genome with deep convolutional neural network
  17. java虚拟机内存查看相关命令
  18. 微型计算机联想扬天a6800,商务新选择 联想扬天A6800V评测
  19. SCI论文写作的学习与总结
  20. 机器学习之梯度提升决策树(GBDT)

热门文章

  1. node.js安装及环境配置超详细教程【Windows系统安装包方式】
  2. 华为设备配置私网IP路由FRR
  3. pychrm设置全局代理
  4. 致态TiPro7000固件Firmware更新+升级软件(英韧IG5236主控)
  5. mybatis plus学习总结
  6. 站台「亚马逊云科技中国峰会」,我成了「开发者大讲堂」演讲嘉宾~
  7. RuntimeError: populate() isn‘t reentrant
  8. 2021年安全员-C证模拟考试系统及安全员-C证操作证考试
  9. 基于微信小程序的移动学习平台的设计与实现_kaic
  10. PTA 7-30 求矩形面积