二叉搜索树介绍及其接口说明
二叉搜索樹介紹
二叉搜索樹是由二叉樹組成的專用于查找和搜索目的的一種數據結構。
在二叉搜索樹中查詢一個結點,從根結點開始,一層一層往下查找,直到找到目標結點為止。以要查找的目標結點為參照,當遇到的結點值比要查找的結點值大時,就順著該結點的左子樹繼續查找;當遇到的結點值比要查找的結點值小時,則順著該結點的右子樹繼續查找。如果在到達樹的分支盡頭前都沒有找到目標結點,則該結點并不存在于樹中。
如下圖1所示,要找出樹中值為15的結點,從根結點開始,因為15比20小,往20的左結點移動。移動到結點值為9的左子結點上,因為15又比9大,所以往9的右結點移動,此時的結點值恰好是15,于是就找到了所需要的目標結點。
當然,搜索一個二叉樹的過程依賴于其結點都是按照類似的方式插入的。因此,要插入一個結點,也是從根結點開始,一層層往下,適當地移動到左或右子結點上,當到達分支的盡頭時,執行插入操作。不允許插入重復的結點值。
如下圖1所示,將值65的結點插入到樹中,從根結點開始,因為65比20大,所以向20的右子結點移動。移動到53,又因為65比53大,所以還是向右移動。移動到79,因為65比79小,所以向79的左子結點移動,此時79已經是樹的分支盡頭了,因此將待插入的結點插入到79對應的左子結點上。插入結束。
二叉搜索樹是一種用于查找操作的高效數據結構,因為在最壞的情況下,只需要查找一個分支上的數據就可以了,而不用檢索每一個數據。因此,查找的復雜度是O(lg n), 這里的n代表樹中的結點的個數。這里樹必須是保持平衡的(對于給定數據的結點,要使樹的高度盡可能的短)。保持二叉搜索樹處于平衡狀態是非常重要的,因為這代表著我們查找的分支都不會特別長。
二叉搜索樹的接口說明
?二叉搜索樹的接口包括初始化、銷毀、插入、移除、查找和樹的大小等操作。
bistree_init
?void bistree_init(BisTree *tree, void (*compare)(const void *key1,const void *key2),void (*destroy)(void *data));
返回值:無
描述:初始化由參數tree所指定的二叉搜索樹。
該函數必須在其他操作執行前調用。函數指針compare指定一個由用戶定義的比較函數。這個比較函數在key1大于key2時返回1,key1小于key2時返回-1,當key1等于key2時返回0。當調用bistree_destroy時,由destroy所指定的析構函數提供了一種釋放動態分配的空間的方法。它的工作方式同前面描述過的bitree_destroy類似。如果二叉搜索樹包含的數據不需要釋放,則destroy應該設置為NULL。
復雜度:O(1)
bistree_destroy
void bistree_init(BisTree *tree);
返回值:無
描述:銷毀由參數tree所指定的二叉搜索樹。
調用該函數后其他任何操作都不允許再執行,除非重新調用bistree_init。bistree_destroy將二叉搜索樹中所有的結點都移除。如果傳給bistree_init的參數destroy不為NULL的話,則每次移除結點時都需要調用由destroy所指定的析構函數。
復雜度:O(n),這里n代表二叉搜索樹中的結點個數。
bistree_insert
int bistree_insert(BisTree *tree, const void *data);
返回值:如果插入操作成功,返回0;如果待插入結點已經在樹中存在,返回1;否則返回-1。
描述:將結點插入由參數tree所指定的二叉搜索樹中。
新結點包含一個指向參數data的指針,因此只要該結點還在樹中,data所引用的內存空間就必須保持有效。由調用者負責管理data所關聯的內存空間。
復雜度:O(lg n),這里n代表二叉搜索樹中的結點個數。
bistree_remove
int bistree_remove(BisTree *tree, const void *data);
返回值:如果移除操作成功返回0;否則返回-1。
描述:在由參數tree所指定的二叉搜索樹中,移除數據同參數data相吻合的結點。
實際上該操作僅僅只執行一種惰性移除,即該結點只是簡單的標識為隱藏。
因此,并不會返回指向結點數據的指針。更進一步的是,樹中的數據就算被移除了也必須保持有效。其結果就是,二叉搜索樹的大小,即bistree_size的返回值,并不會在移除一個結點后遞減。
復雜度:O(lg n),這里n代表二叉搜索樹中的結點的個數。
bistree_lookup
int bistree_lookup(const BisTree *tree, void **data);
返回值:如果成功查找到結點,返回0;否則返回-1。
描述:判斷由參數tree所指定的二叉搜索樹中是否存在數據同參數data相吻合的結點。
如果查找操作成功,則函數返回后參數data指向查找到結點的數據。
復雜度:O(lg n),這里n代表二叉搜索樹中的結點的個數。
bistree_size
int bistree_lookup(const BisTree *tree);
返回值:二叉樹中的結點的個數。
描述:這是一個宏,用來計算由參數tree所指定的二叉搜索樹中的結點的個數。
復雜度:O(1)
轉載于:https://www.cnblogs.com/idreamo/p/8306169.html
總結
以上是生活随笔為你收集整理的二叉搜索树介绍及其接口说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程技术-Volatile关键
- 下一篇: [日常工作]WorkStation 使用