wyiu
Follow.
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
posts - 100, comments - 15, trackbacks - 0
<
2009年4月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
(84)
Design Pattern(1)
POJ(67)
常用模板和函数(3)
数据结构(2)
数值分析(3)
算法(8)
随笔档案
(100)
2010年10月 (8)
2010年3月 (11)
2009年10月 (16)
2009年9月 (1)
2009年8月 (1)
2009年7月 (20)
2009年5月 (16)
2009年4月 (27)
向高手学习
cai0715
RyanWang
wingyiu
搜索
积分与排名
积分 - 27648
排名 - 679
最新评论
1. re: poj 3368 rmq(st)
有错误~~
index[] 可能会以负数为下标~
--tongjiantao
2. re: pku poj 3009
@BOAT
行列搞错了吧?
--yaoyaozii
3. re: pku poj 3009
@ww
郁闷啊。。我怎么也是3 啊。。。郁闷!!!
--BOAT
4. re: pku poj 3009 [未登录]
excit就是这个游戏
--X
5. re: pku2777
这个只能用c++交吗?用G++交的结果很神奇喔,居然CE。。
--share4
阅读排行榜
1. POJ 线段树题(1995)
2. pku poj 3009 (1000)
3. 矩阵转置_十字链表(947)
4. 全主元高斯消元法(793)
5. 关于“逆序数”[转](768)
评论排行榜
1. pku poj 3009 (10)
2. pku 1019 poj(2)
3. pku2777(1)
4. pku 2151(1)
5. poj 3368 rmq(st)(1)
二叉树线索化
输入二叉树
先序
,建树,然后
中序线索化
,遍历输出
1
#include
<
iostream
>
2
using
namespace
std;
3
4
enum
PointerTag
5
{
6
Link,Thread
//
枚举值Link和Thread分别为0,1
7
}
;
8
9
struct
BiThrNode
//
线索二叉树的结点类型
10
{
11
char
data;
12
PointerTag LTag;
//
左标志
13
PointerTag RTag;
//
右标志
14
BiThrNode
*
lchild;
//
左孩子指针
15
BiThrNode
*
rchild;
//
右孩子指针
16
}
;
17
18
typedef BiThrNode
*
BiThrTree;
19
BiThrNode
*
pre
=
NULL;
//
全局量
20
21
void
InOrderThreading(BiThrTree
&
Thrt,BiThrTree T);
//
线索化
22
void
InThreading(BiThrTree p);
//
中序遍历线索化
23
bool
PreOrderCreatBiTree(BiThrTree
&
T);
//
先序建立树
24
void
InOrderTraverse_Thr(BiThrTree T);
//
中序遍历线索树
25
26
int
main()
27
{
28
BiThrTree T,Thrt;
29
printf(
"
输入先序序列('#'表示空节点)建立二叉树:\n
"
);
30
PreOrderCreatBiTree(T);
//
先序建立树
31
InOrderThreading(Thrt,T);
//
中序线索化
32
printf(
"
中序线索化,中序遍历得中缀式:\n
"
);
33
InOrderTraverse_Thr(Thrt);
//
中序遍历线索树
34
printf(
"
\n
"
);
35
return
0
;
36
}
37
38
void
InOrderThreading(BiThrTree
&
Thrt,BiThrTree T)
39
{
40
Thrt
=
new
BiThrNode;
41
Thrt
->
LTag
=
Link;
42
Thrt
->
RTag
=
Thread;
43
Thrt
->
rchild
=
Thrt;
44
if
(
!
T) Thrt
->
lchild
=
Thrt;
45
else
{
46
Thrt
->
lchild
=
T;
47
pre
=
Thrt;
48
InThreading(T);
49
pre
->
rchild
=
Thrt;
50
pre
->
RTag
=
Thread;
51
Thrt
->
rchild
=
pre;
52
}
53
}
54
55
void
InThreading(BiThrTree p)
56
{
57
if
(p)
58
{
59
InThreading(p
->
lchild);
60
if
(
!
p
->
lchild)
{ p
->
LTag
=
Thread; p
->
lchild
=
pre;}
61
if
(
!
pre
->
rchild)
{ pre
->
RTag
=
Thread; pre
->
rchild
=
p; }
62
pre
=
p;
63
InThreading(p
->
rchild);
64
}
65
}
66
67
bool
PreOrderCreatBiTree(BiThrTree
&
T)
68
{
//
该节点非空返回true,双亲节点对应标志Link,空时返回false,双亲节点对应标志应为Thread
69
char
ch;
70
scanf(
"
%c
"
,
&
ch);
71
if
(ch
==
'
#
'
)
72
{
73
T
=
NULL;
74
return
false
;
75
}
else
{
76
T
=
new
BiThrNode;
77
T
->
data
=
ch;
78
if
(PreOrderCreatBiTree(T
->
lchild)) T
->
LTag
=
Link;
//
左孩子存在则左标志为Link
79
else
T
->
LTag
=
Thread;
80
if
(PreOrderCreatBiTree(T
->
rchild)) T
->
RTag
=
Link;
//
右孩子存在则右标志为Link
81
else
T
->
RTag
=
Thread;
82
}
83
return
true
;
84
}
85
86
87
void
InOrderTraverse_Thr(BiThrTree T)
88
{
89
BiThrNode
*
p;
90
p
=
T
->
lchild;
91
while
(p
!=
T)
92
{
93
while
(p
->
LTag
==
Link) p
=
p
->
lchild;
94
printf(
"
%c
"
,p
->
data);
95
while
(p
->
RTag
==
Thread
&&
p
->
rchild
!=
T)
//
if(p->RTag==Thread && p->rchild!=T)
96
{
97
p
=
p
->
rchild;
98
printf(
"
%c
"
,p
->
data);
99
}
100
p
=
p
->
rchild;
101
}
102
}
posted on 2009-05-13 17:00
wyiu
阅读(615)
评论(0)
编辑
收藏
引用
所属分类:
数据结构
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
矩阵转置_十字链表
二叉树线索化
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理