了解
也叫二叉排序樹,中序遍歷是有序的。
性質: 操作
查詢
根據性質:
根節點不為空時:
否則返回f
插入
刪除
首先查詢要刪除的元素是否存在,不存在就直接返回,存在: 效能
插入和刪除操作都必須先查詢,查詢效率代表了二叉搜尋樹中各個操作的效能
對有n個結點的二叉搜尋樹,若每個元素查詢的概率相等,則二叉搜尋樹平均查詢長度是結點在二叉搜尋樹的深度的函式【結點越深,則比較次數越多】
可能會出現單支樹的情況
最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為:log2n
最差情況下,二叉搜尋樹退化為單支樹,其平均比較次數為:n/2
實現
#include
using
namespace std;
template
<
class
t>
struct bstreenode
bstreenode
*_pleft;
bstreenode
*_pright;
t _data;
}template
<
class
t>
class
bstree
node*
find
(const t& data)
return
nullptr;}
bool
insert
(const t& data)
pcur=
newnode
(data);if
(data>_data)
pparent-
>_pleft=pcur;
else
pparent-
>_pright=pcur;
return
true;}
bool
delet
(const t& data)
else}if
(nullptr
==pcur)
return
false
;//僅右孩子if(
nullptr
==pcur-
>_pleft)
}//僅左孩子
elseif(
nullptr
==_pright)
}//左右孩子
else
//用代替節點值替換刪除節點
pcur-
>_data=pdelnode-
>_data;
if(pdelnode==pparent-
>_pleft)
pparent-
>_pleft=pdelnode-
>_pright;
else
pparent-
>_pright=pdelnode-
>_pright;
pcur=pdelnode;
}delete pcur;
return
true;}
node*
leftmost()
node*
rightmost()
void
inorder()
private
:void
_inorder
(node* proot)
} node* _proot;
}//測試
void
testbstree()
; bstree<
int> bst;
for(
auto e : a)
bst.
insert
(e);
cout << bst.
leftmost()
->_data << endl;
cout << bst.
rightmost()
->_data << endl;
bst.
inorder()
; bst.
delete(8
);bst.
inorder()
;}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...