這次貼上二叉搜尋樹的實現,搜尋插入刪除我都實現了遞迴和非遞迴兩種版本(遞迴函式後面有_r標識)
1二叉搜尋樹的性質:#pragma once
2 #include3
using
namespace
std;45
6 template
7struct
bstnode820
};21
2223
2425
2627 template
28class
bstree
2937 ~bstree()
38{}
39bool insert(const k& key,const v&value)
4045 node *cur =_root;
46 node *parent =_root;
47while
(cur)
4854
else
if (cur->_key
5558
else
5962}63
if (parent->_key >key)
6467
else
6871
return
true;72
}73bool insert_r(const k& key, const v&value)
7477
bool remove(const k&key)
7883
if (_root->_left == null && _root->_right ==null)
8489 node *del =_root;
90 node *parent =_root;
91while (del && del->_key !=key)
9298
else
if (del->_key
99102
}103
if(del)
104113
else
114117
}118
else
119125
else
126129
}130
delete
del;
131return
true
;132
}133
else
134142 swap(del->_key, inorderfirst->_key);
143 swap(del->_value, inorderfirst->_value);
144if (inorderfirst->_left ==null)
145150
else
151154
}155
else
156162
else
163166
167}
168delete
inorderfirst;
169return
true
;170
}171
}172
return
false
;173
}174
bool remove_r(const k&key)
175178 node *find(const k&key)
179187
else
if (cur->_key
188191
else
192195
}196
return
null;
197}
198 node *find_r(const k&key)
199202
void
inorder()
203206
protected
:207
bool _remove_r(node *&root,const k&key)
208213
if (root->_key >key)
214217
else
if (root->_key
218221
else
222232
else
233239
}240
else
241247 swap(inorderfirst->_key, root->_key);
248 swap(inorderfirst->_value, root->_value);
249return _remove_r(root->_right, key);
250}
251}
252}
253void _inorder(node *root)
254259 _inorder(root->_left);
260 cout << root->_key << "";
261 _inorder(root->_right);
262}
263 node *_find_r(node *root, const k&key)
264269
if (root->_key
270273
else
if (root->_key >key)
274277
else
278281
}282
bool _insert_r(node *&root, const k& key, const v&value)
283289
290if (root->_key >key)
291294
else
if (root->_key
295298
else
299302
}303
protected
:304 node *_root;
305};
306307
308void
testbinarysearchtree()
309;
312for (int i = 0; i < 10; ++i)
313316
317//
cout << endl;
318//
cout << bst1.find(1)->_key << " ";
319//
cout << bst1.find(5)->_key << " ";
320//
cout << bst1.find(9)->_key << " ";
321//
cout << bst1.find_r(1)->_key << " ";
322//
cout << bst1.find_r(5)->_key << " ";
323//
cout << bst1.find_r(9)->_key << " ";
324//
cout << endl;
325 bst1.remove_r(5
);326 bst1.remove_r(2
);327 bst1.remove_r(8
);328
for (int i = 0; i < 10; ++i)
329332
bst1.inorder();
333 bst1.remove(5
);334 bst1.remove(2
);335 bst1.remove(8
);336
for (int i = 0; i < 10; ++i)
337340
bst1.inorder();
341 }
每個節點都有乙個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。
左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。
右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。
左右子樹都是二叉搜尋樹。
插入步驟很簡單,就是從根節點開始,進行比較,然後我那個左(右)子樹走,走到葉子節點之後,鏈結上就可以了
尋找也是類似插入的,很簡單
刪除就要略微繁瑣一點有三種情況(其實直接就可以歸類為兩種)
被刪除的節點只有乙個孩子(左孩子或者右孩子是空)
被刪除的節點左右孩子都健在(左右孩子都不為空)
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
二叉搜尋樹的實現
binarysearchtree.h inte ce for the binarysearchtree class.include binarytreenode.h include binarytree1.h if defined afx binarysearchtree h 1cd2ff9d 73...
二叉搜尋樹的實現
includeusing namespace std 二叉搜尋樹左兒子的值比當前節點小,右兒子的數值比當前節點大 struct node 建立樹 node insert node p,int x else return p 查詢 bool find node p,int x else return ...