顧名思義,二叉搜尋樹是以一棵二叉樹來組織的,這樣的一棵樹可以用乙個鍊錶結構來表示,每個節點除了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 解釋 輸入為 ...