二叉搜尋樹的模擬實現與總結

2021-10-01 14:35:34 字數 2487 閱讀 7816

二叉搜尋樹又稱二叉排序樹。(⚠️:空樹也是一顆二叉搜尋樹)

搜尋二叉搜尋樹的中序遍歷一定是乙個有序的資料集合。

二叉搜尋樹的最左邊節點一定是最小的節點。

二叉搜尋樹的最右邊節點一定是最大的節點。

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

假設有乙個n個節點的二叉搜尋樹,若每個元素查詢的概率相等,則二叉搜尋樹平均查詢長度是節點在二叉搜尋樹的深度的函式,即節點越深,則比較次數越多。

但是對於乙個資料集合,插入順序不同,可能得到不同結構的二叉搜尋樹。

例:有資料集合  int a[7] = ;

1、右單支二叉搜尋樹

2、完全二叉樹

效能分析:

最優情況下,二叉搜尋樹為完全二叉樹,平均比較次數為:lgn(注:這裡是log以二為底的n)

最差情況下,二叉搜尋樹為右單支,平均比較次數為:n/2;

//二叉搜尋樹(binary search tree)

#include using namespace std;

templatestruct bstnode

bstnode* _pleft;

bstnode* _pright;

t _data;

};// 為了實現簡單,假設二叉搜尋樹中的元素唯一(實際可以重複)

templateclass bstree

bool insert(const t& data)

// 如果非空

// 1.找待插入節點在樹中的位置

node* pcur = _proot;

node* pparent = nullptr;//記錄待插入節點的雙親節點

while (pcur)

// 2. 插入新節點

pcur = new node(data);

if (data < pparent->_data)

pparent->_pleft = pcur;

else

pparent->_pright = pcur;

return true;

} bool delete(const t& data)

else

}if (nullptr == pcur)

return false;

// 2、刪除該節點

node* pdelnode = pcur;

// pcur可能是葉子節點 || 只有右孩子

if (nullptr == pcur->_pleft)

else

}else if (nullptr == pcur->_pright)

}else

pcur->_data = pdel->_data;

// 刪除替代節點pdel

if (pparent->_pleft == pdel)

pparent->_pleft = pdel->_pright;

else

pparent->_pright = pdel->_pright;

pdelnode = pdel;

} delete pdelnode;

return true;

} node* find(const t& data)

return nullptr;

} // 驗證:

//1、中序遍歷後的數列一定有序

//這裡只給使用者乙個介面,為了方便使用者使用

void inorder()

//最左邊的節點一定是最小的

node* leftmost()

return pcur;

} //最右邊的節點一定是最大的

node* rightmost()

return pcur;

}private:

//這裡把中序遍歷的方法給成私有的,是為了讓使用者不用傳參呼叫函式,方便使用者使用

void _inorder(node* proot) }

private:

node* _proot;

};void testbstree()

; for (auto e : a)

t.insert(e);

t.inorder();

cout << endl;

cout << t.leftmost()->_data << endl;

cout << t.rightmost()->_data << endl;

t.delete(6);

t.inorder();

cout << endl;

t.delete(8);

t.inorder();

cout << endl;

t.delete(5);

t.inorder();

cout << endl;

}int main()

{ testbstree();

return 0;

]

模擬實現二叉搜尋樹

二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹 二叉搜尋樹的查詢 非遞迴查詢 node find const k key else if cur key key else return nullptr 遞迴查詢 node findr node root,const k key...

二叉搜尋樹的總結

二叉搜尋樹 binarysearchtree 1 特點 1.每個節點都有乙個作為搜尋依據的關鍵碼 key 所有節點的關鍵碼互不相同。2.左子樹上所有節點的關鍵碼 key 都小於根節點的關鍵碼 key 3.右子樹上所有節點的關鍵碼 key 都大於根節點的關鍵碼 key 4.左右子樹都是二叉搜尋樹 2 ...

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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...