Skip to content

Commit dc99331

Browse files
author
tianqing.liang
committed
集合及映射
1 parent 969fbfa commit dc99331

20 files changed

+296
-126
lines changed
File renamed without changes.

11-Set-And-Map/BSTMap.dart

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import 'Map.dart';
2+
3+
/**
4+
* 二分搜索树映射
5+
*/
6+
class BSTMap<K extends Comparable<K>, V> extends Map<K, V> {
7+
_Node? root;
8+
9+
int? size;
10+
11+
BSTMap() {
12+
root = null;
13+
size = 0;
14+
}
15+
16+
@override
17+
add(key, value) {
18+
// TODO: implement add
19+
root = _addNode(root!, key, value);
20+
}
21+
22+
_Node _addNode(_Node node, K key, V value) {
23+
if (node == null) {
24+
size = size! + 1;
25+
return _Node(key, value);
26+
}
27+
28+
if (key.compareTo(node.key) < 0) {
29+
node.left = _addNode(node.left!, key, value);
30+
} else if (key.compareTo(node.key) > 0) {
31+
node.right = _addNode(node.right!, key, value);
32+
} else {
33+
// key.compareTo(node.key) == 0
34+
node.value = value;
35+
}
36+
return node;
37+
}
38+
39+
_Node? _getNode(_Node? node, K key) {
40+
if (node == null) return null;
41+
42+
if (key.compareTo(node.key) == 0) {
43+
return node;
44+
} else if (key.compareTo(node.key) < 0) {
45+
return _getNode(node.left, key);
46+
} else {
47+
// if(key.compareTo(node.key) > 0)
48+
return _getNode(node.right, key);
49+
}
50+
}
51+
52+
@override
53+
bool contains(key) {
54+
return _getNode(root, key) != null;
55+
}
56+
57+
@override
58+
get(key) {
59+
_Node? node = _getNode(root, key);
60+
return node == null ? null : node.value;
61+
}
62+
63+
@override
64+
int? getSize() {
65+
return size;
66+
}
67+
68+
@override
69+
bool isEmpty() {
70+
return size == 0;
71+
}
72+
73+
@override
74+
remove(key) {
75+
_Node? node = _getNode(root, key);
76+
if(node != null){
77+
root = _removeNode(root!, key);
78+
return node.value;
79+
}
80+
return null;
81+
}
82+
83+
_Node? _removeNode(_Node node, K key){
84+
85+
if( node == null ){
86+
return null;
87+
}
88+
if( key.compareTo(node.key) < 0 ){
89+
node.left = _removeNode(node.left! , key);
90+
return node;
91+
}
92+
else if(key.compareTo(node.key) > 0 ){
93+
node.right = _removeNode(node.right!, key);
94+
return node;
95+
}
96+
else{
97+
// 待删除节点左子树为空的情况
98+
if(node.left == null){
99+
_Node? rightNode = node.right;
100+
node.right = null;
101+
size = size! -1;
102+
return rightNode;
103+
}
104+
// 待删除节点右子树为空的情况
105+
if(node.right == null){
106+
_Node? leftNode = node.left;
107+
node.left = null;
108+
size = size! - 1;
109+
return leftNode;
110+
}
111+
// 待删除节点左右子树均不为空的情况
112+
// 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点
113+
// 用这个节点顶替待删除节点的位置
114+
_Node successor = _minimum(node.right!);
115+
successor.right = _removeMin(node.right!);
116+
successor.left = node.left;
117+
node.left = node.right = null;
118+
return successor;
119+
}
120+
}
121+
122+
// 删除掉以node为根的二分搜索树中的最小节点
123+
// 返回删除节点后新的二分搜索树的根
124+
_Node _removeMin(_Node node){
125+
if(node.left == null){
126+
_Node? rightNode = node.right;
127+
node.right = null;
128+
size = size! -1;
129+
return rightNode!;
130+
}
131+
node.left = _removeMin(node.left!);
132+
return node;
133+
}
134+
135+
// 返回以node为根的二分搜索树的最小值所在的节点
136+
_Node _minimum(_Node node){
137+
if(node.left == null){
138+
return node;
139+
}
140+
return _minimum(node.left!);
141+
}
142+
143+
@override
144+
set(key, newValue) {
145+
_Node? node = _getNode(root, key);
146+
if(node == null){
147+
throw new Exception(" $key + doesn't exist!");
148+
}
149+
node.value = newValue;
150+
}
151+
}
152+
153+
class _Node<K, V> {
154+
K? key;
155+
156+
V? value;
157+
158+
_Node? left, right;
159+
160+
_Node(K key, V value) {
161+
this.key = key;
162+
this.value = value;
163+
left = null;
164+
right = null;
165+
}
166+
}

11-Set/BSTSet.dart renamed to 11-Set-And-Map/BSTSet.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'Set.dart';
22
import 'BST.dart';
33

4-
4+
/**
5+
* 二分搜索树集合
6+
*/
57
class BSTSet<T extends Comparable<T>> extends Set<T>{
68

79
BST? bst;

11-Set/FileOperator.dart renamed to 11-Set-And-Map/FileOperator.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import 'dart:io';
22
import 'dart:convert';
33

4+
/**
5+
* 文件操作类
6+
*/
47
class FileOperator{
58

69
static Future<List> getFileString(String filename) async{
File renamed without changes.

11-Set-And-Map/LinkedListMap.dart

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import 'Map.dart';
2+
3+
/**
4+
* 链表映射
5+
*/
6+
class LinkedListMap<K ,V> extends Map<K ,V>{
7+
8+
_Node? dummyHead;
9+
int? size;
10+
11+
@override
12+
add(key, value) {
13+
_Node? node = _getNode(key);
14+
if(node == null){
15+
dummyHead!.next = _Node(key, value, dummyHead!.next);
16+
size = size! + 1;
17+
}
18+
else{
19+
node.value = value;
20+
}
21+
}
22+
23+
LinkedListMap(){
24+
dummyHead =_Node.withEmty();
25+
size = 0;
26+
}
27+
28+
@override
29+
bool contains(key) {
30+
return _getNode(key) != null;
31+
}
32+
33+
@override
34+
get(key) {
35+
_Node? node = _getNode(key);
36+
return node == null ? null : node.value;
37+
}
38+
39+
@override
40+
int? getSize() {
41+
return size;
42+
}
43+
44+
@override
45+
bool isEmpty() {
46+
return size == 0;
47+
}
48+
49+
@override
50+
V? remove(K key) {
51+
_Node prev = dummyHead!;
52+
while(prev.next != null){
53+
if(prev.next!.key.equals(key))
54+
break;
55+
prev = prev.next!;
56+
}
57+
58+
if(prev.next != null){
59+
_Node delNode = prev.next!;
60+
prev.next = delNode.next;
61+
delNode.next = null;
62+
size = size! -1;
63+
return delNode.value;
64+
}
65+
66+
return null;
67+
}
68+
69+
@override
70+
set(K key, newValue) {
71+
_Node? node = _getNode(key);
72+
if(node == null){
73+
throw new Exception("${key} doesn't exist!");
74+
}
75+
node.value = newValue;
76+
}
77+
78+
_Node? _getNode(K key){
79+
_Node? cur = dummyHead!.next;
80+
while(cur != null){
81+
if(cur.key.equals(key))
82+
return cur;
83+
cur = cur.next;
84+
}
85+
return null;
86+
}
87+
88+
}
89+
class _Node<K ,V >{
90+
K? key;
91+
V? value;
92+
_Node? next;
93+
94+
_Node(this.key, this.value, this.next);
95+
96+
_Node.withEmptyHead(K key, V value){
97+
_Node(key, value, null);
98+
}
99+
100+
_Node.withEmty(){
101+
_Node(null, null, null);
102+
}
103+
@override
104+
String toString() {
105+
// TODO: implement toString
106+
StringBuffer res =new StringBuffer();
107+
res.write("${key.toString()} : ${value.toString()}");
108+
return res.toString();
109+
}
110+
}
111+
File renamed without changes.

11-Set/LinkedListStatck.dart renamed to 11-Set-And-Map/LinkedListStatck.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import 'Stack.dart';
22
import 'LinkedList.dart';
33

4+
/**
5+
* 链表栈
6+
*/
47
class LinkedListStack implements Stack{
58

69
LinkedList? _linkedList;
File renamed without changes.

11-Set-And-Map/Map.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
abstract class Map<K,V>{
2+
add(K key, V value);
3+
V? remove(K key);
4+
bool contains(K key);
5+
V get(K key);
6+
set(K key, V newValue);
7+
int? getSize();
8+
bool isEmpty();
9+
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
8. 快速排序,快速排序优化,二路快排,三路快排
1313
9. 二分搜索,二分搜索优化
1414
10. 二分搜索树,二分搜索树搜索、移除最大最小值
15-
11. 集合,使用二分搜索树构建集合
15+
11. 集合 和 映射
1616

1717
#### SDK版本
1818
1. 版本:2.12.3

part-two/chapter2/class_abstract.dart

Lines changed: 0 additions & 22 deletions
This file was deleted.

part-two/chapter2/class_extends.dart

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)