Skip to content

Commit 76af35e

Browse files
author
tianqing.liang
committed
二分搜索树
1 parent 7a8c818 commit 76af35e

File tree

3 files changed

+212
-0
lines changed

3 files changed

+212
-0
lines changed

10-Binary-Search-Tree/BST.dart

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
/**
2+
* 二分搜索树
3+
*/
4+
class BST<T extends Comparable<T>> {
5+
_Node? root;
6+
7+
int? size;
8+
9+
BST() {
10+
root = null;
11+
size = 0;
12+
}
13+
14+
int? getSize() {
15+
return size;
16+
}
17+
18+
bool isEmpty() {
19+
return size == 0;
20+
}
21+
22+
//添加元素
23+
// add(T t) {
24+
// if (root == null) {
25+
// root = _Node(t);
26+
// size = size! + 1;
27+
// } else {
28+
// addNext(root, t);
29+
// }
30+
// }
31+
add(T e) {
32+
root = addNext(root, e);
33+
}
34+
35+
// 向以node为根的二分搜索树中插入元素e,递归算法
36+
// addNext(_Node? node, T? t) {
37+
// if (t! == node!.e)
38+
// return;
39+
// else if (t.compareTo(node.e) < 0 && node.left == null) {
40+
// node.left = _Node(t);
41+
// size = size! +1;
42+
// return;
43+
// } else if (t.compareTo(node.e) > 0 && node.right == null) {
44+
// node.right = _Node(t);
45+
// size = size! +1;
46+
// return;
47+
// }
48+
// if (t.compareTo(node.e) < 0)
49+
// addNext(node.left, t);
50+
// else //e.compareTo(node.e) > 0
51+
// addNext(node.right, t);
52+
// }
53+
//返回新节点后二分搜索树的根
54+
_Node addNext(_Node? node, T t) {
55+
if (node == null) {
56+
size = size! + 1;
57+
return _Node(t);
58+
}
59+
if (t.compareTo(node.e) < 0) {
60+
node.left = addNext(node.left, t);
61+
} else if (t.compareTo(node.e) > 0) {
62+
node.right = addNext(node.right, t);
63+
}
64+
return node;
65+
}
66+
67+
// 向二分搜索树中添加新的元素e,非递归写法
68+
add2(T e) {
69+
if (root == null) {
70+
root = _Node(e);
71+
size = size! + 1;
72+
return;
73+
}
74+
_Node? p = root;
75+
while (p != null) {
76+
if (e.compareTo(p.e) < 0) {
77+
if (p.left == null) {
78+
p.left = _Node(e);
79+
size = size! + 1;
80+
return;
81+
}
82+
p = p.left;
83+
} else if (e.compareTo(p.e) > 0) {
84+
if (p.right == null) {
85+
p.right = _Node(e);
86+
size = size! + 1;
87+
return;
88+
}
89+
p = p.right;
90+
} else
91+
return;
92+
}
93+
}
94+
95+
//查询元素是否包含
96+
bool contains(T t) {
97+
return _containsAll(root, t);
98+
}
99+
100+
bool _containsAll(_Node? node, T t) {
101+
if (node == null) {
102+
return false;
103+
}
104+
if (t.compareTo(node.e) == 0) {
105+
return true;
106+
} else if (t.compareTo(node.e) < 0) {
107+
return _containsAll(node.left, t);
108+
} else {
109+
return _containsAll(node.right, t);
110+
}
111+
}
112+
113+
// 二分搜索树的前序遍历
114+
preOrder() {
115+
_preOrderDetail(root!);
116+
}
117+
118+
_preOrderDetail(_Node? node) {
119+
if (node == null) {
120+
return;
121+
}
122+
print(node.e);
123+
_preOrderDetail(node.left);
124+
_preOrderDetail(node.right);
125+
}
126+
127+
inOrder() {
128+
_inOrderDetail(root);
129+
}
130+
131+
_inOrderDetail(_Node? node) {
132+
if (node == null) {
133+
return;
134+
}
135+
_inOrderDetail(node.left);
136+
print(node.e);
137+
_inOrderDetail(node.right);
138+
}
139+
140+
postOrder() {
141+
_postOrderDetail(root);
142+
}
143+
144+
_postOrderDetail(_Node? node) {
145+
if (node == null) {
146+
return;
147+
}
148+
_postOrderDetail(node.left);
149+
150+
_postOrderDetail(node.right);
151+
print(node.e);
152+
}
153+
154+
@override
155+
String toString() {
156+
StringBuffer res = new StringBuffer();
157+
_generateBSTString(root!, 0, res);
158+
return res.toString();
159+
}
160+
161+
_generateBSTString(_Node? node, int depth, StringBuffer res) {
162+
if (node == null) {
163+
res.write("${_generateBSTStringDepth(depth)} null \n");
164+
return;
165+
}
166+
res.write("${_generateBSTStringDepth(depth)} ${node.e} \n");
167+
_generateBSTString(node.left, depth + 1, res);
168+
_generateBSTString(node.right, depth + 1, res);
169+
}
170+
171+
_generateBSTStringDepth(int depth) {
172+
StringBuffer res = new StringBuffer();
173+
for (int i = 0; i < depth; i++) {
174+
res.write(" - -");
175+
}
176+
return res.toString();
177+
}
178+
}
179+
180+
class _Node<T> {
181+
T? e;
182+
183+
_Node? left;
184+
185+
_Node? right;
186+
187+
_Node(T t) {
188+
this.e = t;
189+
this.left = null;
190+
this.right = null;
191+
}
192+
}

10-Binary-Search-Tree/Main.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'BST.dart';
2+
void main(){
3+
BST<num> bst = new BST<num>();
4+
var list =[5,3,6,8,4,2];
5+
for(var i = 0;i<list.length;i++){
6+
bst.add(list[i]);
7+
}
8+
//前序遍历
9+
bst.preOrder();
10+
print(bst);
11+
12+
//中序遍历
13+
bst.inOrder();
14+
print(bst);
15+
16+
//后序遍历
17+
bst.postOrder();
18+
print(bst);
19+
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
7. 归并排序,归并排序排序优化,自底向上排序
1212
8. 快速排序,快速排序优化,二路快排,三路快排
1313
9. 二分搜索,二分搜索优化
14+
10. 二分搜索树
1415

1516
#### SDK版本
1617
1. 版本:2.12.3

0 commit comments

Comments
 (0)