二叉搜尋樹又稱二叉排序樹。(⚠️:空樹也是一顆二叉搜尋樹)
搜尋二叉搜尋樹的中序遍歷一定是乙個有序的資料集合。
二叉搜尋樹的最左邊節點一定是最小的節點。
二叉搜尋樹的最右邊節點一定是最大的節點。
二叉搜尋樹的插入和刪除都必須先查詢,因此,查詢效率便代表了二叉搜尋樹中各個操作的效能。
假設有乙個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...