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

已知两种遍历序列求原始二叉树

算法思想:

需要明确的前提条件

  • 通过先序和中序可以求出原始二叉树
  • 通过中序和后序可以求出原始二叉树
  • 但是通过先序和后序无法还原出二叉树

换种说法:

  • 只有通过先序中序或者后序中序才可以确定一个二叉树

先来看一个例子,已知先序遍历序列和中序遍历序列求后序遍历: 
先序:ABCDEFGH 
中序:BDCEAFHG 
求后序: 
分析:要求后序遍历序列,必须求出原始二叉树 
先看先序序列A第一个出现,有先序遍历的定义可以知道A是根结点 
再看中序遍历,A的左边是BDCE,而A的右边是FHG 
 
BDCE哪个是根呢?答案还是从先序遍历找,因为先序遍历根最先出现 
再看B、D、C、E中在先序遍历中最先出现的是B,所以B是BDCE中的根, 
由于B是根,在看中序遍历中B左端没有树,所以DCE是B的右子树 
 
而在DCE中,谁又是根? 
同样的我们看先序遍历序列C先出现,所以C是DCE中的根, 
而此时在中序遍历中C的左端只有一个D,C的右端只有一个E 
根据中序遍历的定义D是C的左子树,E是C的右子树 
 
接着我们再看FHG,F、H、G在先序遍历中最先出现的是F,所以F是FHG中的根, 
再回到中序遍历FHG中F左端再没有结点,右端是HG所以HG是F的右子树 
 
再看HG中谁是根,在先序遍历中G先出现,所以G是根 
再看中序遍历,G的左端只有一个H,右端没有子树,说明H是G的左子树 
 
这样我们就得到了一个原始二叉树,题目的要求是让求这个二叉树的后序遍历序列, 
这样我们可以根据二叉树后序遍历的定义 
写出该二叉树的后序遍历序列:DECBHGFA

以上转载至:http://blog.csdn.net/dean_deng/article/details/47053231

算法实现:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<vector>
 4 using namespace std;
 5 const int N=33;
 6 int z[N],h[N],x[N],n;
 7 //已知中序后序   求先序
 8 void dfs(int r,int zl,int zr)
 9 {
10     //h[r]就是当前根的值
11     printf("%d ",h[r]);
12     int rt,lz,rz;
13     for(rt=1;rt<=n&&h[r]!=z[rt];rt++);//找到当前根在中序里的位置,可用标记数组替代
14     lz=rt-zl;rz=zr-rt;//根据中序判断左右区间大小
15     if(lz>0)    dfs(r-rz-1,zl,rt-1);
16     if(rz>0)    dfs(r-1,rt+1,zr);
17 }
18 //已知中序先序  求后序
19 void dfs2(int l,int zl,int zr)
20 {
21     int rt,lz,rz;
22     for(rt=1;rt<=n&&x[l]!=z[rt];rt++);//找到当前根在中序里的位置,可用标记数组替代
23     lz=rt-zl;rz=zr-rt;//根据中序判断左右区间大小
24     if(lz>0)    dfs2(l+1,zl,rt-1);
25     if(rz>0)    dfs2(l+lz+1,rt+1,zr);
26     printf("%d ",x[l]);
27 }
28 int main()
29 {
30     int i,j;
31     scanf("%d",&n);
32     for(i=1;i<=n;i++)
33         scanf("%d",&x[i]);
34     for(i=1;i<=n;i++)
35         scanf("%d",&z[i]);
36     dfs2(1,1,n);//dfs(n,1,n);
37     puts("");
38     return 0;
39 }
时间: 2024-10-04 00:52:21

已知二叉树的中序遍历和先序/后序遍历求后序/先序的相关文章

(已知二叉树的中后,先中序两序遍历建树)

L2-006 树的遍历 题目链接 L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的个数.第二行给出其后序遍历序列.第三行给出其中序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3

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

可以跟之前这篇形成对比 http://blog.csdn.net/hhooong/article/details/43195395 代码如下: #include<iostream> #include<string> using namespace std ; struct BinTreeNode { char data ; BinTreeNode *left ; BinTreeNode *right ; }; void BinTreeSuccess(char* post,char*

已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出相应的二叉树

面对这种问题时我们该怎么解决? 今天写数据结构题.发现了一道总是碰见问题的题在这里我写了一种求解方法我自己称它为分层递归求解. 第一步通过观察我们知道后序遍历时最后一个是根节点A 在中序序列中A的左边是左子树右边是右子树 第二步我们来画第一层为根节点的右子树为A-C-F watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolv

杭电1710 (已知二叉树前中序 求后序)

#include "iostream" #include "stack" using namespace std; int result[1001]; int cnt; /* 得到后序序列 */ void getPost(int* pre,int* in,int len) { /* 分别记录当前处理二叉树的前序 后序 和 长度*/ if (len == 0) /* 前序序列长度为0 直接返回*/ return; result[cnt++] = pre[0]; /*

已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树

分析的过程: 1.假设前序遍历的第一个值为a,该值就是原二叉树的根节点. 2.在中序遍历结果中查找a. 则在中序遍历中a前面的节点,就是原二叉树a节点左子树的中序遍历结果:在a后面的节点,就是原二叉树a节点右子树的中序遍历结果. 3.由第二步得到a节点左子树的节点个数为m,那么在前序遍历中a后面的m个节点即为a节点左子树的前序遍历结果: 4.由第二步得到a节点右子树的节点个数为n,那么在前序遍历中最后n个节点即为a节点右子树的前序遍历结果: 由此我们可以得到a节点左子树和右子树的前序遍历和中序遍

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

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

//已知二叉树的先序,中序遍历,求后续遍历 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

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo