Skip to content

Commit fc75030

Browse files
Merge pull request #311 from liuzhang/master
二叉搜索树和字典树 C版本
2 parents 1416973 + 2720b8f commit fc75030

File tree

2 files changed

+305
-0
lines changed

2 files changed

+305
-0
lines changed

c-cpp/24_tree/Trie.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*************************************************************************
2+
> Author: Liu Zhang
3+
4+
> Time: 2019-05-10
5+
> Desc: 字典树实现
6+
************************************************************************/
7+
#include <stdio.h>
8+
#include <stdlib.h>
9+
#include <string.h>
10+
11+
#define OK 1
12+
#define ERROR 0
13+
#define TRUE 1
14+
#define FALSE 0
15+
16+
typedef int Status;
17+
18+
typedef struct Node {
19+
char data;
20+
struct Node *children[26];
21+
Status end;
22+
} Trie, *TriePtr;
23+
24+
void Init(TriePtr *T)
25+
{
26+
(*T) = (TriePtr)malloc(sizeof(Trie));
27+
(*T)->data = '/';
28+
(*T)->end = FALSE;
29+
}
30+
31+
void Insert(TriePtr T, char *str) {
32+
33+
int index;
34+
char c;
35+
36+
while(c = *str++)
37+
{
38+
index = c - 'a';
39+
if (T->children[index] == NULL)
40+
{
41+
TriePtr Node;
42+
Node = (TriePtr)malloc(sizeof(Trie));
43+
Node->data = c;
44+
Node->end = FALSE;
45+
T->children[index] = Node;
46+
}
47+
48+
T = T->children[index];
49+
}
50+
51+
T->end = TRUE;
52+
}
53+
54+
55+
Status Search(TriePtr T, char *str) {
56+
57+
int index;
58+
char c;
59+
60+
while(c = *str++)
61+
{
62+
index = c - 'a';
63+
if (T->children[index] == NULL)
64+
{
65+
return FALSE;
66+
}
67+
68+
T = T->children[index];
69+
}
70+
71+
if (T->end) {
72+
return TRUE;
73+
} else {
74+
return FALSE;
75+
}
76+
}
77+
78+
79+
int main(int argc, char const *argv[])
80+
{
81+
TriePtr T;
82+
Init(&T);
83+
char *str = "hello";
84+
char *str2 = "hi";
85+
86+
Insert(T, str);
87+
88+
printf("str is search %d\n", Search(T, str));
89+
printf("str2 is search %d\n", Search(T, str2));
90+
return 0;
91+
}

c-cpp/24_tree/binarysearchtree.c

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
/*************************************************************************
2+
> Author: Liu Zhang
3+
4+
> Time: 2019-05-10
5+
> Desc: 二叉搜索树实现
6+
************************************************************************/
7+
#include <stdio.h>
8+
#include <stdlib.h>
9+
#include <string.h>
10+
11+
#define OK 1
12+
#define ERROR 0
13+
#define TRUE 1
14+
#define FALSE 0
15+
typedef int Status;
16+
typedef char ElemType;
17+
18+
typedef struct node {
19+
ElemType data;
20+
struct node *lchild, *rchild;
21+
} BTree, *BTreePtr;
22+
23+
/**************** 插入 **********************/
24+
Status Insert(BTreePtr *T, ElemType e) {
25+
26+
BTreePtr p;
27+
28+
if (*T == NULL) {
29+
*T = (BTreePtr)malloc(sizeof(BTree));
30+
(*T)->data = e;
31+
32+
return TRUE;
33+
} else {
34+
p = *T;
35+
while ( p != NULL) {
36+
37+
if (e > p->data) {
38+
39+
if (p->rchild == NULL) {
40+
p->rchild = (BTreePtr) malloc (sizeof(BTree));
41+
p->rchild->data = e;
42+
return TRUE;
43+
}
44+
p = p->rchild;
45+
} else {
46+
47+
if (p->lchild == NULL)
48+
{
49+
p->lchild = (BTreePtr) malloc (sizeof(BTree));
50+
p->lchild->data = e;
51+
return TRUE;
52+
}
53+
p = p->lchild;
54+
}
55+
}
56+
}
57+
58+
return FALSE;
59+
}
60+
61+
/**************** 删除 **********************/
62+
Status Delete(BTreePtr T, ElemType e) {
63+
BTreePtr p, pp, minP, minPP, child;
64+
child = NULL;
65+
p = T;
66+
pp = NULL;
67+
68+
while ( (p != NULL) && (p->data != e) ) {
69+
pp = p;
70+
71+
if (e > p->data) {
72+
p = p->rchild;
73+
} else {
74+
p = p->lchild;
75+
}
76+
}
77+
78+
if (p == NULL) return FALSE;
79+
80+
//双节点
81+
if ((p->lchild != NULL) && (p->rchild != NULL))
82+
{
83+
minPP = p;
84+
minP = p->rchild;
85+
86+
while (minP->lchild != NULL) {
87+
minPP = minP;
88+
minP = minP->lchild;
89+
}
90+
p->data = minP->data;
91+
free(minP);
92+
minPP->lchild = NULL;
93+
94+
return TRUE;
95+
}
96+
97+
//有一个节点
98+
if ((p->lchild != NULL) || (p->rchild != NULL)) {
99+
100+
if (p->lchild) {
101+
child = p->lchild;
102+
} else {
103+
child = p->rchild;
104+
}
105+
free(p);
106+
}
107+
108+
//没有节点
109+
if (pp->lchild == p) {
110+
pp->lchild = child;
111+
} else {
112+
pp->rchild = child;
113+
}
114+
115+
return TRUE;
116+
}
117+
118+
/**************** 查找 **********************/
119+
120+
Status Find(BTreePtr T, ElemType e) {
121+
122+
if (T == NULL) return FALSE;
123+
124+
while ((T != NULL) && (T->data != e)) {
125+
126+
if (e > T->data) {
127+
T = T->rchild;
128+
} else {
129+
T = T->lchild;
130+
}
131+
}
132+
133+
if (T) {
134+
return TRUE;
135+
} else {
136+
return FALSE;
137+
}
138+
}
139+
140+
141+
/**************** 最大值 **********************/
142+
ElemType FindMax(BTreePtr T) {
143+
ElemType max;
144+
145+
while(T != NULL) {
146+
max = T->data;
147+
T = T->rchild;
148+
}
149+
return max;
150+
}
151+
152+
153+
/**************** 最小值 **********************/
154+
ElemType FindMin(BTreePtr T) {
155+
ElemType min;
156+
157+
while(T != NULL) {
158+
min = T->data;
159+
T = T->lchild;
160+
}
161+
return min;
162+
}
163+
164+
165+
void PreOrderTraverse(BTreePtr T)//前序遍历二叉树
166+
{
167+
if (T == NULL) return;
168+
169+
if(T)
170+
{
171+
printf("%d ",T->data);
172+
PreOrderTraverse(T->lchild);
173+
PreOrderTraverse(T->rchild);
174+
}
175+
}
176+
177+
178+
void DestroyTree(BTreePtr T) {
179+
if (T)
180+
{
181+
if (T->lchild)
182+
{
183+
DestroyTree(T->lchild);
184+
}
185+
186+
if(T->rchild)
187+
{
188+
DestroyTree(T->rchild);
189+
}
190+
191+
free(T);
192+
T = NULL;
193+
}
194+
}
195+
196+
/***************** 执行测试 *************************/
197+
int main(int argc, char const *argv[])
198+
{
199+
BTreePtr T;
200+
T = NULL;
201+
int a[] = {33, 16, 50, 13, 18, 34, 58, 15, 17, 25, 51, 66, 19, 27, 55};
202+
int i;
203+
for (i = 0; i < 15; i++) {
204+
Insert(&T, a[i]);
205+
}
206+
printf("Max is %d\n", FindMax(T));
207+
printf("Min is %d\n", FindMin(T));
208+
Delete(T, 18);
209+
Delete(T, 13);
210+
PreOrderTraverse(T);
211+
DestroyTree(T);
212+
213+
return 0;
214+
}

0 commit comments

Comments
 (0)