深入理解二叉搜尋樹

2021-08-17 03:56:31 字數 3450 閱讀 9834

二叉搜尋樹

二叉搜尋樹是一以二叉樹來組織的,可以用鍊錶的資料結構來表示,每乙個結點就是乙個物件,包括以下的結構:

bstnode* _pleft;

bstnode* _pright;

bstnode* _parent;

k _key;

v _value;

二叉搜尋樹或者是一棵空樹,或者是具有以下性質的二叉樹:

1、若它的左子樹不為空,則左子樹上所有結點的值都小於根結點的值

2、若它的右子樹不為空,則右子樹上所有結點的值都大於根結點的值

3、它的左右子樹也分別為二叉搜尋樹

搜尋

基本思想:

如果根結點不為空,我們需要查詢的key等於根結點的key,返回根節點的指標;如果查詢key小於根結點的key,在其左子樹中查詢;如果查詢key大於根結點的key,在其右子樹中查詢。否則,返回false

**實現:

pnode find(const k& key)

else

}return

false;

}

插入基本思想:

空樹—->new node—>return true

非空—->搜尋需要插入的位置—->插入

**實現:

//插入

bool insert(const k& key, const v& va

//樹非空

pnode pparent =

null;

//1.找到待插入的結點的位置

while (proot)

else

}//2.插入新結點

if (key < pparent->_key)

pparent->_pleft = newnode;

if (key > pparent->_key)

pparent->_pright = newnode;

return

true;

}

刪除基本思想:

①空樹—>直接返回

②非空—>找待刪除的結點–>

不在樹中–>直接返回

在樹中

a.沒有左右孩子(和b或c合併)

b.只有左孩子

(1)根節點

(2)非根節點(兩種情況,當前結點為上一結點的左孩子、右孩子 c.只有右孩子 d.左右孩子均存在

**實現:

//刪除

bool delete(const k& key)

else

}if (pdel)

//只有右孩子

else

if (pdel->_pleft ==

null)

//左右孩子都存在

else

if (prl->_pright)//prl有右子樹

pparent->_pleft = prl;

else

pparent->_pleft =

null;

pparent->_pright = pdel->_pright;

pnode ppparent = pparent->_parent;

if (pdel == _proot)

_proot->_key = prl->_key;

else

pparent->_key = prl->_key;}}

return

false;

}

全部**:

#include

using namespace std;

template

struct bstnode

bstnode* _pleft;

bstnode* _pright;

bstnode* _parent;

k _key;

v _value;

};template

class bstree

迴圈實現//

//搜尋

pnode find(const k& key)

else

}return

false;

}//插入

bool insert(const k& key, const v& value)

//樹非空

pnode pparent =

null;

//1.找到待插入的結點的位置

while (proot)

else

}//2.插入

if (key < pparent->_key)

pparent->_pleft = newnode;

if (key > pparent->_key)

pparent->_pright = newnode;

return

true;

}//刪除

bool delete(const k& key)

else

}if (pdel)

//只有右孩子

else

if (pdel->_pleft ==

null)

//左右孩子都存在

else

if (prl->_pright)//prl有右子樹

pparent->_pleft = prl;

else

pparent->_pleft =

null;

pparent->_pright = pdel->_pright;

pnode ppparent = pparent->_parent;

if (pdel == _proot)

_proot->_key = prl->_key;

else

pparent->_key = prl->_key;}}

return

false;

}pnode root()

private:

pnode _proot;

};void binsearchtest()

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...