二叉搜尋樹的實現

2022-07-11 08:00:13 字數 4449 閱讀 1024

這次貼上二叉搜尋樹的實現,搜尋插入刪除我都實現了遞迴和非遞迴兩種版本(遞迴函式後面有_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 ...