数据结构——已知先序中序求后序,已知中序后序求先序

  总结下二叉树的已知两种遍历方式求第三种遍历顺序的方法,已知先序和中序遍历或者后序与中序遍历后二叉树是唯一确定的,下面介绍怎么求出第三种遍历顺序。

  先序遍历顺序为:根结点——左子结点——右子结点,中序遍历为:左子结点——根结点——右子结点,我们注意到,先序遍历的第一个元素就是二叉树根结点,我们在中序遍历中以该元素分为左右两部分,则左边为左子树,右边为右子树,递归即可还原二叉树,这个过程中可直接输出后序遍历的顺序。同理,可以用后序与中序还原出先序遍历的顺序。

代码及测试数据如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <malloc.h>
 6 #include <string>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12
13 #define FRER() freopen("in.txt", "r", stdin);
14
15 using namespace std;
16
17 //函数状态码定义
18 #define TRUE        1
19 #define FALSE       0
20 #define OK          1
21 #define ERROR       0
22 #define INFEASIBLE -1
23 #define OVERFLOW   -2
24
25 typedef char TElemType;
26 typedef int Status;
27
28 typedef struct BiNode {
29     TElemType data;
30     struct BiNode *lchild, *rchild;
31 }BiNode, *BiTree;
32
33 BiTree BinaryTreeFormorderings(char *, char *, int);
34 BiTree BinaryTreePostorderings(char *, char *, int);
35
36 /*
37 ABDECFG
38 DBEAFCG
39 DEBFGCA
40 */
41
42 int main()
43 {
44     FRER()
45     int n;
46     char str[100], ptr[100];
47     cin >> n >> str >> ptr;
48     BinaryTreePostorderings(str, ptr, n);
49     return 0;
50 }
51
52 BiTree BinaryTreeFormorderings(char *pre, char *in, int len) {
53     if(len <= 0)
54         return NULL;
55     BiNode *node = new BiNode;
56     node->data = *pre;
57     int idx = 0;
58     while(idx < len) {
59         if(*(in + idx) == *pre)
60             break;
61         ++idx;
62     }
63     node->lchild = BinaryTreeFormorderings(pre + 1, in, idx);
64     node->rchild = BinaryTreeFormorderings(pre + idx + 1, in + idx + 1, len - (idx + 1));
65     cout << node->data << ‘ ‘;
66     return node;
67 }
68
69 BiTree BinaryTreePostorderings(char *in, char *post, int len) {
70     if(len == 0)
71         return NULL;
72     BiNode *node = new BiNode;
73     node->data = *(post + len - 1);
74     cout << node->data << ‘ ‘;
75     int idx = 0;
76     while(idx < len) {
77         if(*(in + idx) == *(post + len - 1))
78             break;
79         ++idx;
80     }
81     node->lchild = BinaryTreePostorderings(in, post, idx);
82     node->rchild = BinaryTreePostorderings(in + idx + 1, post + idx, len - (idx + 1));
83     return node;
84 }

原文地址:https://www.cnblogs.com/fan-jiaming/p/9822765.html

时间: 2024-10-10 21:58:13

数据结构——已知先序中序求后序,已知中序后序求先序的相关文章

二叉树--已知先序中序求后序--已知中序后序求先序(基本按照网上某大神思路搬过来的)

思路来自(转载自)  http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 题目描述不说了. 前序遍历:  GDAFEMHZ 中序遍历:  ADEFGHMZ 求中序遍历. 1 确定根,确定左子树,确定右子树. 2 在左子树中递归. 3 在右子树中递归. 4 打印当前根. 代码如下: 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 char pr[1000],in[100

已知二叉树的先序,中序遍历,求后续遍历

//已知二叉树的先序,中序遍历,求后续遍历 struct TreeNode { char elem; struct TreeNode* left; struct TreeNode* right; }; TreeNode* BinaryTree(char* inorder,char* preorder,int length) { if(length == 0) return NULL; TreeNode* node = new TreeNode; node->elem = *preorder; i

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

已知二叉树的先序遍历和中序遍历序列求后序遍历序列

package algorithm01; import java.util.Scanner; /** * 给出先序遍历和中序遍历序列求出二叉树的后续遍历序列 * @author wxisme * */ public class ToReverse { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s1, s2; while(scan.hasNext()) { s1 =

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和后序遍历序列,求先序遍历序列. 已知该二叉树的中序

二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板

面试的痛 前几天去阿里面试,一时忘记了二叉树的前序遍历中序遍历和后序遍历的概念,已经想死了. 然后最近去腾讯面试,被问到怎么已知前序遍历/后序遍历 + 中序遍历,求后序遍历/前序遍历,看来这种问题很喜欢考. 其实这个问题想清楚了很简单,只要把这三个概念理解透彻就可以做出来了,比如前序遍历的第一个值一定是根节点,然后这个根节点对应到中序遍历里面,在中序遍历的这个值的两边的值,一定在以此节点为根节点的两个子树上,同理,后序遍历也一样. 已知前序遍历和后序遍历是不能求唯一的中序遍历树的. #inclu

树的前中序遍历_求后续遍历

原文链接:http://blog.csdn.net/feliciafay/article/details/6816871 PreOrder:         GDAFEMHZ InOrder:           ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root.

蓝桥 - 求先序排列(知中序和后序求先序)

Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). Input 两行,每行一个字符串,分别表示中序和后序排列 Output 一个字符串,表示所求先序排列 Sample Input BADC BDCA Sample Output ABCD 1 #include <bits/stdc++.h> 2 const int INF=0x3f3f3f3f; 3 typedef long long LL; 4 const doub

由二叉树的前序遍历和后序遍历来求后序遍历的结果

假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder:         GDAFEMHZ InOrder:            ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"ADEFGHMZ"应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root. 第二步,继续观