2012.02.16
数据结构学习笔记(1)利用链式存储结构和递归构建二叉树
书上是用循环实现,我写了用递归实现,代码如下:
1
#include <stdio.h>
2
#include <malloc.h>
3
#define
MaxSize 100
4
typedef
char
ElemType;
5
typedef
struct
node
6
{
7
ElemType data;
//
数据元素
8
struct
node *lchild;
//
指向左孩子结点
9
struct
node *rchild;
//
指向右孩子结点
10
} BTNode;
11
12
void
CreateBTNode(BTNode * &b,
char
*str)
13
{
14
BTNode *St[MaxSize],*p=NULL;
15
int
top=-
1
,k,j=
0
;
16
char
ch;
17
b=NULL;
//
建立的二叉树初始时为空
18
ch=str[j];
19
while
(ch!=
'
\0
'
)
//
str未扫描完时循环
20
{
21
switch
(ch)
22
{
23
case
'
(
'
:
24
top++;St[top]=p;k=
1
;
25
break
;
//
为左孩子结点
26
case
'
)
'
:
27
top--;
28
break
;
29
case
'
,
'
:
30
k=
2
;
31
break
;
//
为孩子结点右结点
32
default
:p=(BTNode *)malloc(
sizeof
(BTNode));
33
p->data=ch;p->lchild=p->rchild=NULL;
34
if
(b==NULL)
//
*p为二叉树的根结点
35
b=p;
36
else
//
已建立二叉树根结点
37
{
38
switch
(k)
39
{
40
case
1
:St[top]->lchild=p;
break
;
41
case
2
:St[top]->rchild=p;
break
;
42
}
43
}
44
}
45
j++;
46
ch=str[j];
47
}
48
}
49
50
BTNode * CreateBTNode2(
char
* &str)
//
风筝写的
51
{
52
BTNode * root=NULL, *p;
53
int
hasson=
0
;
//
判断此结点有没有子结点
54
char
ch = *str;
55
root = (BTNode *)malloc(
sizeof
(BTNode));
56
root->data=
'
\0
'
;
57
root->lchild = root->rchild = NULL;
58
while
(ch !=
'
\0
'
)
59
{
60
switch
(ch)
61
{
62
case
'
(
'
:
//
如果是'(':说明有子结点
63
hasson=
1
;
64
str++;
65
p = CreateBTNode2(str);
66
if
(p->data !=
'
\0
'
)
//
如果子结点不为空,则添加,否则释放
67
{
68
root->lchild = p;
69
}
70
else
71
{
72
free(p);
73
}
74
break
;
75
case
'
)
'
:
//
如果是')':说明结点结束,如果当前结点有子结点,
76
//
则')'属于此结点,str++跳到下一个,否则')'属于父结点,应由父结点进行操作
77
if
(hasson ==
1
)
78
{
79
str++;
80
}
81
return
root;
82
case
'
,
'
:
//
如果是',':说明有右子结点,如果当前结点有子结点,
83
//
则','属于此结点,否则','属于父结点,应由父结点进行操作
84
if
(hasson ==
1
)
85
{
86
str++;
87
p = CreateBTNode2(str);
88
if
(p->data !=
'
\0
'
)
89
{
90
root->rchild = p;
91
}
92
else
93
{
94
free(p);
95
}
96
}
97
else
98
{
99
return
root;
100
}
101
break
;
102
default
:
//
是一个新节点,需要递归取值
103
{
104
str++;
105
root->data = ch;
106
}
107
}
108
ch = *str;
109
}
110
return
root;
111
}
112
113
//
以下主函数用做调试
114
void
main()
115
{
116
BTNode *b,*p=NULL;
117
char
* str =
"
A(B(D,),C(,F))
"
;
118
CreateBTNode(b,str);
119
p = CreateBTNode2(str);
120
int
tmp;
121
scanf(
"
%d
"
, tmp);
122
}
编了好久,3个多小时,⊙﹏⊙b汗。。。
特记录在此,以便以后查看。

