二叉搜尋樹

2021-10-04 04:37:10 字數 2206 閱讀 3978

了解

也叫二叉排序樹,中序遍歷是有序的。

性質: 操作

查詢

根據性質:

根節點不為空時:

否則返回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 解釋 輸入為 ...