(解释部分来自http://www.slyar.com/blog/
)
这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的,证明略。
一、已知二叉树的前序序列和中序序列,求解树。
1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点左边和右边都为空,则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。
二、已知二叉树的后序序列和中序序列,求解树。
1、确定树的根。树根是当前树中所有元素在后序遍历中最后出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点左边和右边都为空,则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。
举例说明
:根据已知求解二叉树
中序序列 HLDBEKAFCG
后序序列 LHDKEBFGCA
1、在后序序列LHDKEBFGCA中最后出现的元素为A,HLDBEK|A
|FCG
2、在后序序列LHDKEB中最后出现的元素为B,HLD|B
|EK|A
|FCG
3、在后序序列LHD中最后出现的元素为D,HL|D
|B|EK|A|FCG
4、在后序序列LH中最后出现的元素为H,H
|L|D|B|EK|A|FCG
5、在后序序列KE中最后出现的元素为E,H
|L|D|B|E
|K|A|FCG
5、在后序序列FGC中最后出现的元素为C,H
|L|D|B|E|K|A|F|C
|G
6、所有元素都已经定位,二叉树求解完成。
A
/ \
B C
/ \ / \
D E F G
/ \
H K
\
L
代码如下:
1
/*
2
功能: 1.利用树的前序和中序序列创建树
3
2.利用树的后序和中序序列创建树
4
*/
5
#include
<
iostream
>
6
#include
<
cstring
>
7
using
namespace
std;
8
9
char
pre[
50
]
=
"
ABDHLEKCFG
"
;
//
前序序列
10
char
mid[
50
]
=
"
HLDBEKAFCG
"
;
//
中序序列
11
char
post[
50
]
=
"
LHDKEBFGCA
"
;
//
后序序列
12
13
typedef
struct
_Node
14
{
15
char
v;
16
struct
_Node
*
left;
17
struct
_Node
*
right;
18
}Node,
*
PNode;
19
20
void
PostTravelTree(PNode pn);
//
树的后序递归遍历
21
void
PreTravelTree(PNode pn);
//
树的前序递归遍历
22
void
PreMidCreateTree(PNode
&
pn,
int
i,
int
j,
int
len);
//
利用前序中序序列创建树
23
void
PostMidCreateTree(PNode
&
pn,
int
i,
int
j,
int
len);
//
利用后序中序序列创建树
24
int
Position(
char
c);
//
确定c在中序序列mid中的下标,假设树的各个节点的值各不相同
25
26
27
int
main()
28
{
29
PNode root1
=
NULL, root2
=
NULL;
30
31
PreMidCreateTree(root1,
0
,
0
, strlen(mid));
34
PostTravelTree(root1); cout
<<
endl;
36
PostMidCreateTree(root2, strlen(post)
-
1
,
0
, strlen(mid));
37
PreTravelTree(root2); cout
<<
endl;
38
39
return
0
;
40
}
41
42
43
int
Position(
char
c)
44
{
45
return
strchr(mid,c)
-
mid;
46
}
47
48
49
/*
利用前序中序序列创建树,参考了http://hi.baidu.com/sulipol/blog/item/f01a20011dcce31a738b6524.html
50
*的实现,代码十分简洁,竟然只有短短的"令人发指"的8行,递归实在太彪悍了!!!!!!!!!!!!!!!!!!!!!
51
* i: 子树的前序序列字符串的首字符在pre[]中的下标
52
* j: 子树的中序序列字符串的首字符在mid[]中的下标
53
* len: 子树的字符串序列的长度
54
*/
55
void
PreMidCreateTree(PNode
&
pn,
int
i,
int
j,
int
len)
56
{
57
if
(len
<=
0
)
58
return
;
59
60
pn
=
new
Node;
61
pn
->
v
=
pre[i];
62
int
m
=
Position(pre[i]);
63
PreMidCreateTree(pn
->
left, i
+
1
, j, m
-
j);
//
m-j为左子树字符串长度
64
PreMidCreateTree(pn
->
right, i
+
(m
-
j)
+
1
, m
+
1
, len
-
1
-
(m
-
j));
//
len-1-(m-j)为右子树字符串长度
65
}
66
67
68
/*
利用后序中序序列创建树
69
* i: 子树的后序序列字符串的尾字符在post[]中的下标
70
* j: 子树的中序序列字符串的首字符在mid[]中的下标
71
* len: 子树的字符串序列的长度
72
*/
73
void
PostMidCreateTree(PNode
&
pn,
int
i,
int
j,
int
len)
74
{
75
if
(len
<=
0
)
76
return
;
77
78
pn
=
new
Node;
79
pn
->
v
=
post[i];
80
int
m
=
Position(post[i]);
81
PostMidCreateTree(pn
->
left, i
-
1
-
(len
-
1
-
(m
-
j)), j, m
-
j);
//
注意参数:m-j左子树的长度,len-1-(m-j)右子树的长度
82
PostMidCreateTree(pn
->
right, i
-
1
, m
+
1
, len
-
1
-
(m
-
j));
83
}
84
85
86
void
PostTravelTree(PNode pn)
//
后序递归遍历
87
{
88
if
(pn)
89
{
90
PostTravelTree(pn
->
left);
91
PostTravelTree(pn
->
right);
92
cout
<<
pn
->
v
<<
"
"
;
93
}
94
}
95
96
97
void
PreTravelTree(PNode pn)
//
前序递归遍历
98
{
99
if
(pn)
100
{
101
cout
<<
pn
->
v
<<
"
"
;
102
PreTravelTree(pn
->
left);
103
PreTravelTree(pn
->
right);
104
}
105
}
分享到:
相关推荐
* 已知二叉树前序和中序,求后序 * @param pre * @param mid * @param last * @param i */ public static int i =0;//i:表示要插入后序序列的位置对于生成的后序序列,应该从最后位置开始写, // 所以...
根据给定文件的信息,本文将围绕“已知先序和中序遍历序列,求后序遍历序列”的核心主题进行展开,详细解析其中涉及的数据结构与算法,并深入理解其在C语言中的实现细节。 ### 数据结构:二叉树 在计算机科学中,*...
一、实验目的 1、掌握二叉树的基本概念,链表描述方法;遍历方法。 二、实验内容 1、 创建二叉树类。二叉树的存储结构使用...4、 接收键盘录入的二叉树前序序列和中序序列(各元素各不相同),输出该二叉树的后序序列。
由给定的前序和中序或者给定的中序和后序确定一棵二叉树的算法
二叉树遍历问题 二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序...
给定二叉树前序和中序求后序 序列中的字符不重复
C语言,数据结构课程,知道中序和后序遍历,画二叉树和写出前序遍历。
已知中序,前序和后序,中序,恢复二叉树 本文将详细介绍如何根据中序和后序、或中序和先序序列来恢复二叉树。我们将通过对代码的解释,详细介绍如何使用递归函数来构建二叉树,并使用先序和后序遍历来验证结果。 ...
在数据结构的学习中,我们经常会接触到二叉树的遍历方式,其中中序遍历、前序遍历和后序遍历是最基本也是最重要的三种遍历方法。本篇内容主要探讨的是如何从中序遍历结果转换到前序遍历或后序遍历的结果,这一过程...
二叉树已知前序和中序遍历,求后序遍历,C++代码已编译通过,可直接运行
[问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
二叉树 根据给定的前序中序遍历,求后序遍历 C++代码
"前序中序求后序"就是一种常见的二叉树遍历问题,它涉及到三种主要的遍历方式:前序遍历、中序遍历和后序遍历。在C语言中,这些问题通常通过递归函数来解决,而无需构建二叉链表结构。 前序遍历(Preorder ...
二叉树已知后序和中序遍历求前序遍历,C++编写已通过编译
两种序输入二叉树,恢复该二叉树并打印出树形
软件学习中的二叉树,及其前序、中序、后序排列相关的C语言程序设计
本节将详细介绍二叉树的前序、中序和后序遍历,以及如何求解二叉树的深度和叶节点数量。 **前序遍历(Preorder Traversal)** 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。在代码实现中,通常采用递归的方式...
在给定的描述中,提到可以通过前序和中序序列恢复二叉树。这是因为二叉树的前序和中序序列足以唯一确定一棵树。具体方法是利用中序序列找到根节点,然后通过前序序列划分左子树和右子树,递归地进行同样的操作,直到...
定义二叉树类,封装构造二叉树操作、遍历操作. 实现由先序、中序序列构造二叉树的算法 实现由后序、中序序列构造二叉树的算法