二叉搜尋樹,又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:
若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值
若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值
它的左右子樹也分別為二叉搜尋樹
1、最左側的節點一定是所有節點中最小的,最右側的節點一定是所有節點中最大的
2、中序遍歷是有序的
若根節點不為空:
如果根節點key==查詢key,返回true
如果根節點key > 查詢key,在其左子樹查詢
如果根節點key < 查詢key,在其右子樹中查詢
否則,返回false
1、樹為空,則直接插入
2、樹不為空,按二叉搜尋樹性質查詢插入節點位置,插入新節點
首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回,否則要刪除的節點可能分以下幾種情況
a). 要刪除的節點無孩子節點
b). 要刪除的節點只有左孩子節點
c). 要刪除的節點只有右孩子節點
d). 要刪除的節點有左、右孩子節點
上面四種情況,在實際考慮時可以將情況a與情況b或者情況c合併起來,因此真正刪除情況如下:
情況b:刪除該節點且使被刪除節點的雙親節點指向被刪除節點的左孩子節點
情況b:刪除該節點且使被刪除節點的雙親節點指向被刪除節點的右孩子節點
情況d:在它的右子樹中尋找中序下的第乙個節點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該節點的刪除問題
#include
using
namespace std;
//為了簡化問題,將二叉搜尋樹定義為節點值都不相同的樹
template
<
class
t>
struct bstnode
bstnode
* _pleft;
bstnode
* _pright;
t _data;};
template
<
class
t>
class
bstree
~bstree()
pnode find
(const t& data)
pnode pcur = _proot;
while
(pcur)
else
if(data < pcur-
>_data)
else
}//未找到
return
nullptr;}
void
inorder()
pnode leftmost()
return pcur;
}return
nullptr;}
pnode rightmost()
return pcur;
}return
nullptr;}
bool
insert
(const t& data)
pnode pcur = _proot;
pnode pparent =
nullptr
;while
(pcur)
else
if(data > pcur-
>_data)
else
} pcur =
newnode
(data);if
(data < pparent-
>_data)
else
return
true;}
bool
delete
(const t& data)
pnode pcur = _proot;
pnode pparent =
nullptr
;while
(pcur)
else
if(data < pcur-
>_data)
else}if
(nullptr
== pcur)
pnode pdeletenode = pcur;if(
nullptr
== pcur-
>_pright)
else
else}}
elseif(
nullptr
== pcur-
>_pleft)
else
else}}
else
pcur-
>_data = pdelete-
>_data;
if(pparent-
>_pleft == pdelete)
pparent-
>_pleft = pdelete-
>_pright;
else
pparent-
>_pright = pdelete-
>_pright;
pdeletenode = pdelete;
}return
true;}
private
:void
_inorder
(pnode proot)
}private
: pnode _proot;};
void
testbstree()
;for
(auto e : a)
tree.
insert
(e);
tree.
inorder()
; cout << tree.
leftmost()
->_data << endl;
cout << tree.
rightmost()
->_data << endl;
tree.
delete(0
);tree.
inorder()
; tree.
delete(5
);tree.
inorder()
; tree.
delete(9
);tree.
inorder()
;}intmain()
最優情況下,二叉搜尋樹為完全二叉樹,其查詢效率為:o(log2n)
最差情況下,二叉搜尋樹退化為單支樹,其查詢效率為:o(n)
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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...
二叉搜尋樹 修剪二叉搜尋樹
第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...
樹 二叉樹 二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...