1 #ifndef 二叉查找树_H
2 #define 二叉查找树_H
3
4 #include <iostream>
5
6 //using namespace std; 头文件里不要这样写
7
8 enum Boolean {FALSE, TRUE};//自己做一个boolean
9
10 template<class Type>
11 class Element
12 {
13 public:
14 Type key;
15 //添加更多的数据较容易
16 };
17
18 template <class Type> class BST;//前置声明BST,友元类的使用才不会出错
19
20 template <class Type>
21 class BstNode//树节点
22 {
23
24 friend class BST<Type>; //BST可以使用private
25 public:
26 Element<Type> data;
27 BstNode* LeftChild;
28 BstNode* RightChild;
29 void display(int i);
30
31 };
32
33
34 template <class Type>
35 class BST
36 {
37
38 public:
39 BST(BstNode<Type> *init = 0)//构造函数是可以设置默认参数值
40 {
41
42 root = init;
43 }
44
45 Boolean Insert(const Element<Type>& x );
46 BstNode<Type>* Search(const Element<Type>& x);//递归查找需要用两个函数
47 BstNode<Type>* Search(BstNode<Type>*, const Element<Type>&);
48 BstNode<Type>* IterSearch(const Element<Type>&);//迭代查找
49 void display()
50 {
51 cout << "\n";
52 if(root)
53 root->display(1);
54 else
55 cout << "这是空树\n";
56
57 }
58
59 private:
60 BstNode<Type> *root;
61
62 };
63
64 template <class Type>
65 void BstNode<Type>::display(int i)//用来显示当前节点的数据以及他左子树和右子树的数据
66 {
67 std::cout << "Position: " << i << ", data. key = " << data.key << "\n";
68 if(LeftChild) LeftChild->display(2*i);//当前节点位置为i,左子树位置为2*i
69 if(RightChild)RightChild->display(2*i+1);//右子树位置为2*i+1
70
71 }
72
73 template<class Type>
74 Boolean BST<Type>::Insert(const Element<Type> &x)
75 {
76 BstNode<Type> *p = root;
77 BstNode<Type> *q = 0;//q指向p的父节点,q也是指向当前正在操作节点的父节点
78 //Insert之前要先查找
79 while(p)//此循环用来找一个位置插入p
80 {
81
82 q = p;//每次在p指向自己的子树之前,先用q把p保存下来,因此q就是p的父节点
83
84 if(x.key == p->data.key)return FALSE; //发现重复,失败
85
86 else
87 {
88 if(x.key < p->data.key)
89 p = p->LeftChild; //如果要插入的数据比根p的数据小,指向p的左子树
90 else
91 p = p->RightChild; //如果要插入的数据比根p的数据大,指向p的右子树
92 }
93 }
94
95 //当循环没有返回任何值时,就找到了一个位置q,插入的节点就成为了p的左子树或右子树
96
97 //创捷一个新的节点p
98 p = new BstNode<Type>;
99 p->LeftChild = p->RightChild = 0;
100 p->data = x;
101 if(!root) root = p;
102 else if(x.key < q->data.key) q->LeftChild = p;
103 else q->RightChild = p;
104 return TRUE;
105
106 }
107
108 template<class Type>
109 BstNode<Type>* BST<Type>::Search(const Element<Type> &x)
110 {
111
112 return Search(root, x);
113
114 }
115
116 template<class Type>
117 BstNode<Type>* BST<Type>::Search(BstNode<Type> * b, const Element<Type> &x)
118 {
119 if(!b) return 0;
120 else if(x.key == b->data.key) return b;
121 else if(x.key < b->data.key) return Search(b->LeftChild, x);
122 else if(x.key > b->data.key) return Search(b->RightChild, x);
123 }
124
125 template <class Type>
126 BstNode<Type>* BST<Type>::IterSearch(const Element<Type> &x)
127 {
128
129 for(BstNode<Type>* t = root; t; )
130 {
131
132 if(x.key == t->data.key) return t;
133 if(x.key < t->data.key)
134 t =t->LeftChild;
135 else
136 t = t->RightChild;
137
138 }
139 return 0;
140
141 }
142
143 #endif
1 //用来测试
2 #include <iostream>
3 #include "二叉查找树.h"
4 using namespace std;
5
6 int main()
7 {
8 BST<int> m;
9 Element<int> a, b, c, d, e, f, g, h, i, j, k, l;
10 a.key = 5;
11 b.key = 3;
12 c.key = 11;
13 d.key = 3;
14 e.key = 15;
15 f.key = 2;
16 g.key = 8;
17 h.key = 22;
18 i.key = 20;
19 j.key = 9;
20
21 cout << endl;
22 cout << m.Insert(a) << endl; //a = 5,就是root
23 cout << m.Insert(b) << endl;
24 cout << m.Insert(c) << endl;
25 cout << m.Insert(d) << endl;
26 cout << m.Insert(e) << endl;
27 cout << m.Insert(f) << endl;
28 cout << m.Insert(g) << endl;
29 cout << m.Insert(h) << endl;
30
31 m.display();
32 cout << endl;
33
34 BstNode<int> *p = m.Search(f);
35 cout << "找到的是:" <<p->data.key << endl;
36 BstNode<int> *p2 = m.IterSearch(f);
37 cout << "找到的是:" <<p2->data.key << endl;
38 cout << "Hello,测试!" << endl;
39 return 0;
40 }