Skip to content

Commit 274945e

Browse files
author
tianqing.liang
committed
红黑树
1 parent 7f1b62b commit 274945e

File tree

5 files changed

+395
-5
lines changed

5 files changed

+395
-5
lines changed

19-AVL-Tree/Main.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'FileOperator.dart';
22
import 'BST.dart';
33
import 'AVLTree.dart';
44

5+
56
void main() async{
67

78
print("Pride and Prejudice");

20-Red-Black-Tree/AVLTree.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class AVLTree<K extends Comparable<K>, V> {
4545
1 + [_getHeight(node.left), _getHeight(node.right)].reduce(max);
4646
// 计算平衡因子
4747
int balanceFactor = getBalanceFactor(node);
48-
if (balanceFactor> 1 && getBalanceFactor(node.left) >= 0) {
48+
if (balanceFactor > 1 && getBalanceFactor(node.left) >= 0) {
4949
return _rightRotate(node);
5050
}
5151
//
@@ -240,18 +240,19 @@ class AVLTree<K extends Comparable<K>, V> {
240240
// 用这个节点顶替待删除节点的位置
241241
_Node successor = _minimum(node.right!);
242242
//w维持平衡性操作,不再执行removemin
243-
successor.right = _removeNode(node.right!,successor._key);
243+
successor.right = _removeNode(node.right!, successor._key);
244244
successor.left = node.left;
245245
node.left = node.right = null;
246246
// return successor;
247247
retNode = successor;
248248
}
249-
if(retNode == null) {
249+
if (retNode == null) {
250250
return null;
251251
}
252252

253253
// 更新height
254-
retNode.height = 1 + [_getHeight(retNode.left), _getHeight(retNode.right)].reduce(max);
254+
retNode.height =
255+
1 + [_getHeight(retNode.left), _getHeight(retNode.right)].reduce(max);
255256

256257
// 计算平衡因子
257258
int balanceFactor = getBalanceFactor(retNode);
@@ -278,7 +279,6 @@ class AVLTree<K extends Comparable<K>, V> {
278279
}
279280

280281
return retNode;
281-
282282
}
283283

284284
// 删除掉以node为根的二分搜索树中的最小节点

20-Red-Black-Tree/Main.dart

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import 'FileOperator.dart';
2+
import 'BST.dart';
3+
import 'AVLTree.dart';
4+
import 'RBTree.dart';
5+
6+
7+
void main() async{
8+
9+
print("Pride and Prejudice");
10+
11+
List words = await FileOperator.getFileString('text2.txt');
12+
13+
// words.sort();
14+
15+
// Test BST
16+
var now = new DateTime.now();
17+
num startTime = now.millisecondsSinceEpoch;
18+
19+
BST<String, num> bst = BST();
20+
for (String word in words) {
21+
if (bst.contains(word))
22+
bst.set(word, bst.get(word) + 1);
23+
else
24+
bst.add(word, 1);
25+
}
26+
27+
for(String word in words)
28+
bst.contains(word);
29+
30+
var endNow = new DateTime.now();
31+
num endTime = endNow.millisecondsSinceEpoch;
32+
33+
double time = (endTime - startTime) / 1000.0;
34+
print("BST: $time s");
35+
36+
// Test AVL
37+
var startNow1 = new DateTime.now();
38+
var startTime1 = startNow1.millisecondsSinceEpoch;
39+
40+
AVLTree<String, num> avl = AVLTree();
41+
for (String word in words) {
42+
if (avl.contains(word))
43+
avl.set(word, avl.get(word) + 1);
44+
else
45+
avl.add(word, 1);
46+
}
47+
48+
for(String word in words)
49+
avl.contains(word);
50+
51+
var endNow1 = new DateTime.now();
52+
var endTime1 = endNow1.millisecondsSinceEpoch;
53+
54+
double time3 = (endTime1 - startTime1) / 1000.0;
55+
print("AVL: $time3 s");
56+
57+
// Test BRTree
58+
var startNow2 = new DateTime.now();
59+
var startTime2 = startNow2.millisecondsSinceEpoch;
60+
61+
RBTree<String, num> rb = RBTree();
62+
for (String word in words) {
63+
if (rb.contains(word))
64+
rb.set(word, rb.get(word) + 1);
65+
else
66+
rb.add(word, 1);
67+
}
68+
69+
for(String word in words)
70+
avl.contains(word);
71+
var endNow2 = new DateTime.now();
72+
var endTime2 = endNow2.millisecondsSinceEpoch;
73+
74+
double time2 = (endTime2 - startTime2) / 1000.0;
75+
print("RBTree: $time2 s");
76+
77+
78+
}

20-Red-Black-Tree/Main2.dart

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import 'FileOperator.dart';
2+
import 'BST.dart';
3+
import 'AVLTree.dart';
4+
import 'dart:math';
5+
import 'RBTree.dart';
6+
7+
8+
void main() async{
9+
10+
11+
// int n = 20000000;
12+
int n = 1000000;
13+
14+
Random random = new Random(n);
15+
16+
List testData = List.empty(growable: true);
17+
18+
for(int i = 0 ; i < n ; i ++)
19+
testData.add(random.nextInt(1<<32));
20+
21+
// Test BST
22+
var now = new DateTime.now();
23+
num startTime = now.millisecondsSinceEpoch;
24+
25+
BST<num, num> bst = BST();
26+
for (num x in testData)
27+
bst.add(x, 0);
28+
29+
var endNow = new DateTime.now();
30+
num endTime = endNow.millisecondsSinceEpoch;
31+
32+
double time = (endTime - startTime) / 1000.0;
33+
print("BST: $time s");
34+
35+
// Test AVL
36+
var startNow1 = new DateTime.now();
37+
var startTime1 = startNow1.millisecondsSinceEpoch;
38+
39+
AVLTree<num, num> avl = AVLTree();
40+
for (num word in testData) {
41+
avl.add(word, 1);
42+
}
43+
var endNow1 = new DateTime.now();
44+
var endTime1 = endNow1.millisecondsSinceEpoch;
45+
46+
time = (endTime1 - startTime1) / 1000.0;
47+
print("AVL: $time s");
48+
49+
// Test BRTree
50+
var startNow2 = new DateTime.now();
51+
var startTime2 = startNow2.millisecondsSinceEpoch;
52+
53+
RBTree<num, num> rb = RBTree();
54+
for (num word in testData) {
55+
rb.add(word, 1);
56+
}
57+
58+
var endNow2 = new DateTime.now();
59+
var endTime2 = endNow2.millisecondsSinceEpoch;
60+
61+
double time2 = (endTime2 - startTime2) / 1000.0;
62+
print("RBTree: $time2 s");
63+
64+
65+
}

0 commit comments

Comments
 (0)