二叉搜尋樹

2021-09-19 10:58:26 字數 2512 閱讀 4366

顧名思義,二叉搜尋樹是以一棵二叉樹來組織的,這樣的一棵樹可以用乙個鍊錶結構來表示,每個節點除了data還有left、right、parent,分別指向節點的左孩子,右孩子和父節點。如果對應的節點不存在則指向nil節點。(因為最簡單的二叉搜尋樹中的nil節點裡並沒有有用資訊,所以在實現時簡單的指向null也是可以的,本文中就會這麼實現)

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

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

它的左右子樹也分別是二叉搜尋樹

二叉樹的查詢

若根節點不為空,則:

如果要查詢的值與根節點的值相同,即要查詢data==根節點data,則返回true;

如果要查詢的值比根節點的值小,即要查詢data《根節點data,則在其左子樹進行查詢

如果要查詢的值比根節點的值大,即要查詢data>根節點data,則在其右子樹進行查詢

二叉樹的插入

#pragma once

#include#includeusing namespace std;

templatestruct bstnode

};templateclass bstree

~bstree()

bool insert(const t& data)

//非空則先找到應插入的位置

pnode pparent = nullptr;

pnode pcur = _proot; //記錄一下pcur的雙親位置

while(pcur)

//插入節點

pcur = new node(data);

if(data < pparent->_data)

pparent->_pleft = pcur;

else

pparent->_pright = pcur;

return true;

} bool erase(const t& data)

else

}if(nullptr == pcur) //沒有找到

return false;

//分情況刪除節點:

//1.葉子節點||只有右孩子,則左孩子為空—— pparnet->right = pcur->right;(為雙親的右孩子) 或者 pparent->left = pcur->right(為雙親的左孩子);(待刪除節點為非根節點) 為根節點則更新proot然後直接刪除節點即可

//2.只有左孩子

//3.左右孩子均存在

if(nullptr == pcur->_pleft) //情況1

}else if(nullptr == pcur->_pright) //情況2

}else

//找到右子樹的最左側節點,替代節點,一定沒有左孩子,可能有右孩子

pcur->_data = pfirstofin->_data;

//刪除替代節點

if(pfirstofin == pparent->_pleft)

pparent->_pleft = pfirstofin->_pright;

else

pparent->_pright = pfirstofin->_pright;

pcur = pfirstofin;

} delete pcur;

return true;

} void inorder()

pnode find(const t& data)

return nullptr;

}private:

void _inorder(pnode _proot) //中序遍歷 }

void _destroy(pnode& proot)

}};void testbstree()

; bstreet;

for(auto e : a)

t.insert(e);

t.inorder();

bstnode* pnode = t.find(0);

if(pnode)

cout << "yes"插入和刪除操作都必須先查詢,查詢效率代表了二叉搜尋樹中各個操作的效能。

對於有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 解釋 輸入為 ...