Maple's Blog.

映射

字数统计: 823阅读时长: 4 min
2019/07/11 Share

实现的代码如下:

1
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include<iostream>
using namespace std;
template <typename Key,typename Value>
class BSTMap{
private:
struct Node{
Key key;
Value value;
Node *left;
Node *right;
Node(Key key,Value value){
this->key=key;
this->value=value;
this->left=this->right=NULL;
}
};

Node *root;
int size;
public:
BSTMap(){
this->root=NULL;
this->size=0;
}

//判断映射中一共有多少个元素
int getSize(){
return size;
}

//判断映射是否为空
bool isEmpty(){
return size==0;
}

//给映射中添加元素对
void add(Key key,Value value){
root=add(root,key,value);
size++;
}

//判断映射中是否含有key这个节点
bool contains(Key key){
return getNode(root,key)!=NULL;
}

//将key这个键的value改为newvalue
void set(Key key,Value newvalue){
Node *node=getNode(root,key);
if(node==NULL) {
cout<<"没有key这个节点,修改失败";
}
node->value=newvalue;
}
//返回映射中节点最小节点的value
Value removeMin(){
Node *ret=minimun(root);
root=removeMin(root);
return ret->value;
}

//删除以key的节点,并返回该节点的value
Value remove(Key key){
Node *ret=getNode(key);
root=remove(root,key);
return ret->value;
}

//中序遍历
void InOrder(){
Inorder(root);
}

private:
//添加节点
Node * add(Node *node,Key key,Value value){
if(node==NULL)
return new Node(key,value);
else if(node->key>key)
node->left=add(node->left,key,value);
else if(node->key<key)
node->right=add(node->right,key,value);
else
node->value=value;
return node;
}

//返回最小节点
Node *minimum(){
return minimun(root);
}
//非递归
Node *minimun(Node *node){
while(node->left!=NULL){
node=node->left;
}
return node;
}
//递归
Node *minimun2(Node *node){
if(node->left!=NULL)
return minimun2(node->left);
return node;
}

//得到键为key的节点
Node *getNode(Key key){
Node *ret=getNode(root,key);
if(ret==NULL) {
cout << "该节点为空" << endl;
return NULL;
}
return ret;
}

Node *getNode(Node *node,Key key){
if(node==NULL)
return NULL;
else if(node->key==key)
return node;
else if(node->key>key)
return getNode(node->left,key);
else
return getNode(node->right,key);
}

//删除最小节点并返回root节点
Node *removeMin(Node *node){
if(node->left==NULL){
Node *ret=node->right;
node->right=NULL;
size--;
return ret;
}
node->left=removeMin(node->left);
return node;
}

//删除键为key的节点
Node *remove(Node *node,Key key){
if(node==NULL)
return NULL;
else if(node->key<key)
node->right=remove(node->right,key);
else if(node->key>key)
node->left=remove(node->left,key);
else{
if(node->left==NULL){
Node *ret=node->right;
node->right=NULL;
size--;
return ret;
}
if(node->right==NULL){
Node *ret=node->left;
node->left=NULL;
size--;
return ret;
}
Node *ret=minimun(node->right);
ret->right=removeMin(node->right);
ret->left=node->left;
node->left=node->right=NULL;
return ret;
}
return node;
}

void Inorder(Node *node){
if(node!=NULL){
Inorder(node->left);
cout<<node->key<<"<->"<<node->value<<endl;
Inorder(node->right);
}
}



};
int main(){
//
// 该二叉树如下:
// 99
// / \
// 77 188
// / \ / \
// 31 80 170 193
// / /
// 101 189
// \
// 190
BSTMap <int,string> *bst=new BSTMap<int,string>();
bst->add(99,"Zhao");
bst->add(77,"Qian");
bst->add(188,"sun");
bst->add(31,"li");
bst->add(80,"Zhou");
bst->add(170,"Wu");
bst->add(193,"Zhen");
bst->add(101,"Wang");
bst->add(189,"Feng");
bst->add(190,"cheng");

bst->InOrder();
cout<<endl;

bst->remove(188);
bst->removeMin();
bst->set(77,"hhhhh");
cout<<bst->getSize()<<endl;
bst->InOrder();
cout<<endl;
return 0;
}

原文作者:Maple

原文链接:http://yoursite.com/2019/07/11/映射/

发表日期:July 11th 2019, 8:53:43 pm

更新日期:July 11th 2019, 8:53:43 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG