二叉查找樹(BST),顧名思義,其有利于數(shù)據(jù)的查找、搜索。
所謂二叉查找樹:
1、其有可能是一顆空樹。
2、若不是空樹
=每個節(jié)點有一個關(guān)鍵值(在這里假設(shè)每兩個元素沒有相同的關(guān)鍵值,對于相同的可以根據(jù)具體問題需要來設(shè)計自己的BST)
=根節(jié)點的關(guān)鍵值(如果有)比左子樹關(guān)鍵值大,但是比右子樹關(guān)鍵值小。
=根節(jié)點的左右子樹也是二叉查找樹(BST)。
現(xiàn)在就具體問題具體分析。
構(gòu)建一個BST,在BST中查找一個關(guān)鍵值,如果查找成功則顯示查找成功和比較次數(shù)
如果查找不成功則顯示查找成功和比較次數(shù)
首先定義二叉查找樹的節(jié)點
ADT BSTNode
操作對象:其關(guān)鍵值data
基本操作:
BSTNode();//構(gòu)建一個節(jié)點
ADT BSTree
操作對象:BSTNode
基本操作:
BSTree();//構(gòu)建空BST
void insert(int k); //向該樹中插入K
bool Search(BTreeNode* node1,int k,int&); //搜索根節(jié)點node的數(shù)且值為k節(jié)點
void DeleteBST(BTreeNode *); //刪除樹釋放空間
BTreeNode* Getroot(){return Root;}//返回根節(jié)點,以便外部函數(shù)調(diào)用
int Getcount(){return count;} //返回搜索的次數(shù)
int GetSize(){return size;} //返回該樹節(jié)點數(shù)
void Clear(){count=0;} //用于每次搜索完后將搜索次數(shù)清0,以便記錄下次搜索的次數(shù)
~BSTree(); //撤銷BST
其代碼如下
1
#include<iostream.h>
2
const int MaxSize=100;
3
class BSTree;
4
/**//*
5
**節(jié)點定義及構(gòu)造函數(shù)的實現(xiàn)
6
*/
7
class BTreeNode
{
8
friend class BSTree; //申明友元以便訪問其私有變量
9
public:
10
BTreeNode()
{
11
left=NULL;
12
right=NULL;
13
}
14
private:
15
int data;
16
BTreeNode* left;
17
BTreeNode* right;
18
};
19
/**//*
20
**BST的定義
21
*/
22
class BSTree
{
23
public:
24
BSTree();
25
void insert(int k); //向該樹中插入K
26
bool Search(BTreeNode* node1,int k,int&); //搜索根節(jié)點node的數(shù)且值為k節(jié)點
27
void DeleteBST(BTreeNode *); //刪除樹釋放空間
28
BTreeNode* Getroot()
{return Root;}//返回根節(jié)點,以便外部函數(shù)調(diào)用
29
int Getcount()
{return count;} //返回搜索的次數(shù)
30
int GetSize()
{return size;} //返回該樹節(jié)點數(shù)
31
void Clear()
{count=0;} //用于每次搜索完后將搜索次數(shù)清0,以便記錄下次搜索的次數(shù)
32
~BSTree(); //釋放內(nèi)存
33
private:
34
BTreeNode* Root;
35
int size; //記錄該二叉查找樹的大小
36
int count; //記錄比較次數(shù)
37
};
38
/**//*
39
**BST的實現(xiàn)
40
*/
41
BSTree::BSTree()
{
42
count=0; //記錄數(shù)據(jù)清0
43
int n;
44
cout<<"請輸入BST節(jié)點個數(shù):";
45
cin>>n;
46
size=n; //輸入二叉查找樹的大小
47
Root=NULL;
48
}
49
void BSTree::insert(int k)
{
50
BTreeNode* p=Root;
51
BTreeNode* pp=NULL;
52
while(p)
{
53
pp=p;
54
if(p->data>k)
55
p=p->left;
56
else
57
p=p->right;
58
}
59
BTreeNode* R=new BTreeNode;
60
R->data=k;
61
if(Root)
{
62
if(pp->data>k)
63
pp->left=R;
64
else
65
pp->right=R;
66
}
67
else
68
Root=R;
69
}
70
bool BSTree::Search(BTreeNode* r,int k,int &e)
{
71
if(r)
{//查找關(guān)鍵值為k,并用e保存
72
if(r->data==k)
{
73
e=r->data;
74
count++;
75
return true;
76
}
77
else if(r->data>k )
{
78
count++;
79
Search(r->left,k,e);
80
}
81
else if(r->data<k)
{
82
count++;
83
Search(r->right,k,e);
84
}
85
}
86
else
87
return false;
88
}
89
void BSTree::DeleteBST(BTreeNode *r)
{
90
if(r)
{//按照后序遍歷的方式刪除該樹
91
DeleteBST(r->left);
92
DeleteBST(r->right);
93
delete r;
94
r=NULL;
95
}
96
}
97
BSTree::~BSTree()
{
98
DeleteBST(Root);
99
}
100
/**//*
101
測試
102
*/
103
void main()
104

{
105
BSTree bst;
106
int Array[MaxSize];
107
cout<<"請輸入二叉查找樹的數(shù)據(jù):";
108
for(int i=0;i<bst.GetSize();i++)
109
{
110
cin>>Array[i];
111
}
112
for(i=0;i<bst.GetSize();i++)
113
{
114
bst.insert(Array[i]);
115
}
116
int k,x;
117
cout<<"請輸入要查找的數(shù):";
118
cin>>k;
119
while(bst.Search(bst.Getroot(),k,x))
120
{
121
cout<<"查找成功! 比了"<<bst.Getcount()<<"次"<<endl;
122
bst.Clear();
123
cout<<"請輸入要查找的數(shù):";
124
cin>>k;
125
}
126
cout<<"查找不成功! 比了"<<bst.Getcount()<<"次"<<endl;
127
cin.get();
128
129
}
130
131
132

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



31



32

33

34

35

36

37

38


39

40

41



42

43

44

45

46

47

48

49



50

51

52



53

54

55

56

57

58

59

60

61



62

63

64

65

66

67

68

69

70



71



72



73

74

75

76

77



78

79

80

81



82

83

84

85

86

87

88

89



90



91

92

93

94

95

96

97



98

99

100


101

102

103

104



105

106

107

108

109



110

111

112

113



114

115

116

117

118

119

120



121

122

123

124

125

126

127

128

129

130

131

132
