博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树——前序和中序得到后序
阅读量:7198 次
发布时间:2019-06-29

本文共 2116 字,大约阅读时间需要 7 分钟。

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

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

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

可以发现,二叉树前序中的第一个节点为树的根节点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 
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 }

转载于:https://www.cnblogs.com/lusufei/p/7154115.html

你可能感兴趣的文章
sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询...
查看>>
jQuery判断复选框是否勾选
查看>>
Qt编程之d指针与q指针
查看>>
zendstudio添加注释快捷键
查看>>
OC 获取城市首字母
查看>>
Android中Application类用法
查看>>
Ubuntu上安装gtk2.0不能安装的问题,“下列的软件包有不能满足的依赖关系”
查看>>
JS window.open()属性
查看>>
javascript原型Prototype
查看>>
Git_分支管理
查看>>
初识GO语言——安装Go语言
查看>>
static关键字总结
查看>>
Playmaker全面实践教程之简单的使用Playmaker示例
查看>>
对于jdk jre jvm的简单认识
查看>>
eclipse快捷键
查看>>
关于C文件输入与输出
查看>>
6个可以隐藏运行bat,浏览器等程序的方法
查看>>
【iCore3 双核心板】例程三:EXTI中断输入实验——读取ARM按键状态
查看>>
css style study
查看>>
【iCore3 双核心板_FPGA】例程八:触发器实验——触发器的使用
查看>>