数据结构已知后序和中序画出该树

已知二叉树后序遍历序列是DBCEFGHA,中序遍历序列EDCBAHFG,它的前序遍历的序列是?麻烦再画下这二叉树.

后续遍历的顺序是左右根,中序遍历的顺序是左根右 
这点应该懂吧 
由后续访问序列可以看出最后一个被访问的必定是这个树的根 
而中序遍历的序列可以看出,一棵树当根确定后,在根前面被访问的是他的左子树,后边的是他的右子树元素 
弄懂了上边两点就开始做题吧 
由后序遍历序列是DBCEFGHA 
为了方便,我写小写字母了啊 
可以看出整棵树的根节点是a 
再看中序遍历序列EDCBAHFG 
a是根节点 
左子树由a左边的元素EDCB构成 
右子树由a右边的元素HFG构成 
也就是 

/----/ 
EDCB--HFG 
到这里应该都懂吧 
那接下来就着重讲一下左子树的确定 
右子树同理可得了 
看左子树有4个元素EDCB 
后序遍历序列是DBCE 
最后访问e 
可以确定a下边连接的是e 
根据中序遍历序列EDCB 
最先访问e 
由于中序遍历e前面没有元素 
可以确定e左子树为空 
即下面的样子 

// 


dbc 
也就是还剩下dbc的顺序没理好 
后序遍历序列是dbc 
最后访问c 
则c为根节点 
连接e 
中序遍历序列dcb 
c前边有d 
后边有b 
哪么可以确定dcb这棵树为 

// 
d b 
哪么整棵树的左子树就确定了 
为 



// 
d b 
同理 
右子树应为 





则整棵树就出来了 
为下图所示 
得出整棵树 
前序遍历自然不在话下 
为aecdbhgf 
------------------------
晕了,想偷下懒都不行呵
同理就是要你自己照着刚才的方法再推右边啊
左边在上边已经说了
那我们来看右边
右边剩下HFG
后序遍历序列是fgh
h最后被访问
可以确定h是右子树的根
也就是与a连着的是h
接下来看中序遍历顺序是HFG
h前面没有元素
说明h的左子树为空
剩下的g和f都是他的右子树的元素
再看后续遍历序列FG
g最后被访问
可以确定g是根节点连接h
然后看中序遍历序列fg
f在前
哪么f应该为g的左子树
整棵树就出来了

再不懂我也不知道怎么解释了

------------------------- 
好久没做类似的题 
有点生疏了 
若果有错 
欢迎指出

时间: 2024-10-24 16:57:12

数据结构已知后序和中序画出该树的相关文章

已知二叉树前、中序遍历,求后序 / 已知二叉树中、后序遍历,求前序

void solve(int start,int end,int root) { // 前序和中序 -> 后序 // 每次调用solve()函数,传入pre-order的start,end,root if (start > end) // 递归边界 return; int i = start; while (i < end && in.at(i) != pre.at(root)) // 找到左右子树的分割点 i++; solve(start, i - 1, root +

已知二叉树前序和中序,求二叉树。

如题,给出二叉树的前序遍历和中序遍历,怎么还原二叉树. 假如一个二叉树的前序遍历为:12453,中序遍历为:42513.由于这颗二叉树比较简单,可以用 凑 的方法很容易凑出符合题意的二叉树(没有写这篇文章之前,我都是用这种笨方法的..尴尬). 即如图: 那么有没有一个标准的方法来推导呢?当然是有的! 我们来分析一下这棵树的前序和中序. 先看前序:12453,第一个字符"1"肯定是整棵树root节点,这不用解释.至于第二个字符以及往后的字符就没有什么可用的信息了. 再看中序:42513,

数据结构已知先序和中序画出该树

这道题目很经典,具体如下: 已知遍历结果如下,试画出对应的二叉树: 前序:A B C E H F I J D G K 中序:A H E C I F J B D K G 解题要点: 1.前序.中序.后序--都针对中间那个节点而言(根节点也是中间的节点). 前序,指先遍历中间节点,然后左,然后右. 中序,指左--中--右. 后序,指右--中--左. 2.根据两种不同序列的遍历方法,便可画出二叉树. 解题答案如下:(对照着看会好理解这道题目一些的) 解题思路: 1.前序中序都首先找出A,推断出:A没有

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

总结下二叉树的已知两种遍历方式求第三种遍历顺序的方法,已知先序和中序遍历或者后序与中序遍历后二叉树是唯一确定的,下面介绍怎么求出第三种遍历顺序. 先序遍历顺序为:根结点——左子结点——右子结点,中序遍历为:左子结点——根结点——右子结点,我们注意到,先序遍历的第一个元素就是二叉树根结点,我们在中序遍历中以该元素分为左右两部分,则左边为左子树,右边为右子树,递归即可还原二叉树,这个过程中可直接输出后序遍历的顺序.同理,可以用后序与中序还原出先序遍历的顺序. 代码及测试数据如下: 1 #includ

[无需建树]已知前序或后序和中序遍历结果,输出前序或后序或层次遍历的方法汇总

最近刷PAT老是碰到这种憨批题目,这种题目在算法面试中也是常客了,主要分为4类 已知前序 中序,求后序 已知前序 中序,求层次 已知后序 中序,求前序 已知前序 中序,求层次 而这四种题目如果要做出来的话,通通不需要建树,因为建树也是按照一定的递归顺序来的,就算是层次遍历,也可以在递归途中保存一些信息来获得. 我们先给出一颗二叉树 可以得到以下信息 前序:4,1,3,2,6,5,7 中序:1,2,3,4,5,6,7 后序:2,3,1,5,7,6,4 层次:4,1,6,3,5,7,2 前序&中序-

PAT A1020——已知后序中序遍历求层序遍历

1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree. Input

二叉树遍历 ——已知后序,中序求层序 A1020.(25)

若直接DFS递归求解,会栈溢出 #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int maxn=50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],in[maxn],post[maxn];//先序,中序,后序 i

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

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

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

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