已知二叉树怎么输出前二叉树的先序中序后序序

【HihoCoder】已知二叉树先序遍历、中序遍历,求后序遍历问题
hihocoder本周的练习题相对还是比较简单O(∩_∩)O~
二叉树的遍历问题已经是我们平时遇到的题目中比较常见的问题了。针对上面这个问题,经过解析会发现规律:
先序遍历就是:根值--&左子树--&右子树
中序遍历就是:左子树--&根值--&右子树
后序遍历就是:根值--&左子树--&右子树
认识到这个问题之后再来看上面那个问题:
假如随手画一棵树,
先序遍历是:FDCABEGHIJK
中序遍历是:ACBDEFHGJIK
可以看出:
1、首先这个树的根是F,左子树中有ACBDE节点,右子树有HGJIK节点;
2、左子树的先序遍历和中序遍历为:DCABE ,&ACBDE
从而可以将问题分而治之,求树的后序遍历可以转化为求子树的后序遍历;
下面是代码,不得不吐槽新浪真心不适合显示代码 T_T:
import java.util.S
public class Main {
class Node{
public Node getTree(String preStr,String midStr){
if(preStr!=null&&preStr!=""){
Node result = new Node();
char a = preStr.charAt(0);
result.data =
if(preStr.length()&1){
String leftStr = "";
String rightStr = "";
if(midStr.startsWith(String.valueOf(a))){
rightStr = midStr.substring(1);
}else if(midStr.endsWith(String.valueOf(a))){
leftStr = midStr.substring(0, midStr.length()-1);
String[] strs = midStr.split(String.valueOf(a));
leftStr =strs[0];
rightStr = strs[1];
if(leftStr!=null&&leftStr!=""){
String leftPre = preStr.substring(1,
leftStr.length()+1);
result.left = getTree(leftPre, leftStr);
if(rightStr!=null&&rightStr!=""){
String rightPre = preStr.substring(leftStr.length()+1,
preStr.length());
result.right = getTree(rightPre, rightStr);
public void queryTree(Node root){
if(root!=null){
queryTree(root.left);
queryTree(root.right);
System.out.print(root.data);
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String preStr = scanner.nextLine();
String midStr = scanner.nextLine();
Main eg = new Main();
Node root = eg.getTree(preStr,midStr);
eg.queryTree(root);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。西西软件下载最安全的下载网站、值得信赖的软件下载站!
→ 二叉树前序、中序、后序遍历相互求法
v1.14 中文绿色版
类型:FTP 工具大小:106KB语言:中文 评分:5.0
今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。首先,我们看看前序、中序、后序遍历的特性:&前序遍历:&&&& 1.访问根节点&&&& 2.前序遍历左子树&&&& 3.前序遍历右子树&中序遍历:&&&& 1.中序遍历左子树&&&& 2.访问根节点&&&& 3.中序遍历右子树&后序遍历:&&&& 1.后序遍历左子树&&&& 2.后序遍历右子树&&&& 3.访问根节点一、已知前序、中序遍历,求后序遍历例:前序遍历: & & & & GDAFEMHZ中序遍历: & & & & ADEFGHMZ画树求法:第一步,根据前序遍历的特点,我们知道根结点为G第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。&第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:1 确定根,确定左子树,确定右子树。2 在左子树中递归。3 在右子树中递归。4 打印当前根。那么,我们可以画出这个二叉树的形状:那么,根据后序的遍历规则,我们可以知道,后序遍历顺序为:AEFDHZMG编程求法:(依据上面的思路,写递归程序) 1 #include &iostream&
2 #include &fstream&
3 #include &string&
5 struct TreeNode
struct TreeNode*
struct TreeNode*
12 void BinaryTreeFromOrderings(char* inorder, char* preorder, int length)
if(length == 0)
//cout&&&invalid length&;
TreeNode* node = new TreeN//Noice that [new] should be written out.
node-&elem = *
int rootIndex = 0;
for(;rootIndex & rootIndex++)
if(inorder[rootIndex] == *preorder)
BinaryTreeFromOrderings(inorder, preorder +1, rootIndex);
BinaryTreeFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));
cout&&node-&elem&&
36 int main(int argc, char* argv[])
printf(&Hello World!\n&);
char* pr=&GDAFEMHZ&;
char* in=&ADEFGHMZ&;
BinaryTreeFromOrderings(in, pr, 8);
printf(&\n&);
46 }输出的结果为:AEFDHZMG二、已知中序和后序遍历,求前序遍历依然是上面的题,这次我们只给出中序和后序遍历:中序遍历: & & & ADEFGHMZ后序遍历:&&&&&& AEFDHZMG画树求法:第一步,根据后序遍历的特点,我们知道后序遍历最后一个结点即为根结点,即根结点为G。第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前后序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:1 确定根,确定左子树,确定右子树。2 在左子树中递归。3 在右子树中递归。4 打印当前根。这样,我们就可以画出二叉树的形状,如上图所示,这里就不再赘述。那么,前序遍历: & & & & GDAFEMHZ编程求法:(并且验证我们的结果是否正确)#include &iostream&
#include &fstream&
#include &string&
struct TreeNode
struct TreeNode*
struct TreeNode*
TreeNode* BinaryTreeFromOrderings(char* inorder, char* aftorder, int length)
if(length == 0)
return NULL;
TreeNode* node = new TreeN//Noice that [new] should be written out.
node-&elem = *(aftorder+length-1);
std::cout&&node-&elem&&std::
int rootIndex = 0;
for(;rootIndex & rootIndex++)//a variation of the loop
if(inorder[rootIndex] ==
*(aftorder+length-1))
node-&left = BinaryTreeFromOrderings(inorder, aftorder , rootIndex);
node-&right = BinaryTreeFromOrderings(inorder + rootIndex + 1, aftorder + rootIndex , length - (rootIndex + 1));
int main(int argc, char** argv)
char* af=&AEFDHZMG&;
char* in=&ADEFGHMZ&;
BinaryTreeFromOrderings(in, af, 8);
printf(&\n&);
}输出结果:GDAFEMHZ
08-2404-0411-0610-1410-1109-2509-2506-0108-0303-20
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(af0e43cb-ua98).
重新安装浏览器,或使用别的浏览器以下试题来自:
单项选择题已知二叉树的前序序列为ABCDEFG,中序序列为DBCAFEG,则后序序列为( )。A.DCBAFGEB.DCBFGEAC.DCBFEGAD.DCBGFEA
为您推荐的考试题库
你可能感兴趣的试题
1A.运算速度快B.联网的计算机能够互相共享资源C.计算精度高D.内存容量大2A.管理软件B.系统软件C.编辑软件D.应用软件3A.软件与硬件的接口B.主机与外设的接口C.计算机与用户的接口D.高级语言与机器语言的接口4A.SNMPB.SMTPC.POP3D.FTP5A.统一资源定位器B.Internet协议C.简单邮件传输协议D.传输控制协议
热门相关试卷
最新相关试卷二叉树前序、中序、后序遍历相互求法
来源:博客园
今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。
首先,我们看看前序、中序、后序遍历的特性: 前序遍历:
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树 中序遍历:
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树 后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点
一、已知前序、中序遍历,求后序遍历
例:
前序遍历:
GDAFEMHZ
中序遍历:
ADEFGHMZ
画树求法:第一步,根据前序遍历的特点,我们知道根结点为G
第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。
第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。
第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。
第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
那么,我们可以画出这个二叉树的形状:

那么,根据后序的遍历规则,我们可以知道,后序遍历顺序为:AEFDHZMG
编程求法:(依据上面的思路,写递归程序)

 1 #include &iostream&

 2 #include &fstream&

 3 #include &string&

 4 
 5 struct TreeNode
 6 {
 7
struct TreeNode*
 8
struct TreeNode*
 9
char
10 };
11 
12 void BinaryTreeFromOrderings(char* inorder, char* preorder, int length)
13 {
14
if(length == 0)
15
//cout&&"invalid length";
17
return;
18
TreeNode* node = new TreeN//Noice that [new] should be written out.
20
node-&elem = *
21
int rootIndex = 0;
22
for(;rootIndex & rootIndex++)
23
if(inorder[rootIndex] == *preorder)
25
break;
26
//Left
28
BinaryTreeFromOrderings(inorder, preorder +1, rootIndex);
29
//Right
30
BinaryTreeFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));
31
cout&&node-&elem&&
32
return;
33 }
34 
35 
36 int main(int argc, char* argv[])
37 {
38
printf("Hello World!\n");
39
char* pr="GDAFEMHZ";
40
char* in="ADEFGHMZ";
41
BinaryTreeFromOrderings(in, pr, 8);
43 
44
printf("\n");
45
return 0;
46 }

输出的结果为:AEFDHZMG
二、已知中序和后序遍历,求前序遍历
依然是上面的题,这次我们只给出中序和后序遍历:
中序遍历:
ADEFGHMZ
后序遍历:
AEFDHZMG
画树求法:第一步,根据后序遍历的特点,我们知道后序遍历最后一个结点即为根结点,即根结点为G。
第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。
第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。
第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前后序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。
第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
这样,我们就可以画出二叉树的形状,如上图所示,这里就不再赘述。
那么,前序遍历:
GDAFEMHZ
编程求法:(并且验证我们的结果是否正确)

#include &iostream&
#include &fstream&
#include &string&

struct TreeNode
{
struct TreeNode*
struct TreeNode*
char
};


TreeNode* BinaryTreeFromOrderings(char* inorder, char* aftorder, int length)
{
if(length == 0)
return NULL;
TreeNode* node = new TreeN//Noice that [new] should be written out.
node-&elem = *(aftorder+length-1);
std::cout&&node-&elem&&std::
int rootIndex = 0;
for(;rootIndex & rootIndex++)//a variation of the loop
if(inorder[rootIndex] ==
*(aftorder+length-1))
break;
node-&left = BinaryTreeFromOrderings(inorder, aftorder , rootIndex);
node-&right = BinaryTreeFromOrderings(inorder + rootIndex + 1, aftorder + rootIndex , length - (rootIndex + 1));
return
}

int main(int argc, char** argv)
{
char* af="AEFDHZMG";
char* in="ADEFGHMZ"; 
BinaryTreeFromOrderings(in, af, 8); 
printf("\n");
return 0;
}

输出结果:GDAFEMHZ
三、已知前序、后序遍历,求中序遍历
(这个结果不唯一,你有什么想法呢?)
 
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动}

我要回帖

更多关于 二叉树前序中序后序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信