二叉查詢樹

2021-06-30 16:28:16 字數 2766 閱讀 9850

不知道為什麼,之前寫的二叉查詢樹被csdn刪掉了,往上搜了一下好像好挺多這種情況,不管了,就當是為了學習吧,再寫一遍好了。

二叉查詢樹是一種特殊的二叉樹,之所以特殊是因為它的查詢效率很高,而查詢效率高的原因是對節點的組織方式遵從下面的兩條規則:

1. 所有的父節點的左子樹中的元素的key小於父節點的key

2. 所有的父節點的右子樹中的結點的key大於父節點的key

既然稱之為查詢樹,先來說說它是如何查詢到乙個key所在的節點的。

簡單的說就是從樹根開始,如果要查詢key大於根的key值,則在它的又子樹中找,否則就在左子樹中找,這樣下來,數有多高,查詢的最壞情況就是多少,所以查詢的時間複雜度為:o(h).

node *tree_search(node* tree, int key)

return x;

}

最大元素和最小元素分別是樹的最右側元素和最左側元素:

最小元素:

node* tree_minimum(node* node)

最大元素:

node* tree_maximum(node* node)

樹的遍歷有三種方式:

先輸出左兒子,再輸出父節點,最後輸出右兒子,叫中序遍歷。先輸出父節點,再輸出左兒子,最後輸出右兒子,叫前序遍歷

先輸出左兒子,再輸出右兒子,最後輸出父節點,叫後續遍歷

分別為:

中序遍歷:

void tree_inorder_walk(node * tree)

前序遍歷:

void tree_inorder_walk(node * tree)

後序遍歷:

void tree_inorder_walk(node * tree)

前驅和後繼的概念非常簡單,在進行中序遍歷時,乙個節點的緊鄰前乙個節點就是前驅節點,後乙個節點就是後繼節點。中序遍歷總是先輸出小數再輸出大數,所以是以從小到大的順序輸出的。也就是說乙個節點的前驅就是比它小的第乙個數,後驅就是比它大的第乙個數

在乙個二叉樹中,對於乙個節點來說,誰在它後面輸出誰就是後繼。

1. 如果該節點有右子樹,右子樹種最小者(使用tree_minimum操作)是後繼。

2. 如果沒有右子樹, 下乙個要輸出就是它的祖先節點中的乙個,就是向上找,直到找到乙個向右拐的叉時停下來,此時第乙個向右拐的節點就是它的後繼。對於乙個樹的右子數的最右邊節點,一直向上找都不會找到乙個向右拐的結點,所以就不存在後繼。其實這個節點是最後乙個輸出的,沒有人是它的後繼。同理,最小的那個節點同樣沒有前驅。

對於乙個節點,誰在它前面輸出,誰就是它的前驅,所以第乙個輸出的節點沒有前驅。

1. 如果節點有左子樹,則左子樹中最大的那個就是這個節點的前驅。

2. 如果沒有左子樹,下乙個要輸出的就是它的祖先節點中的乙個,向上找,找到乙個向左拐的結點,就是它的前驅。

演算法**如下:

找到乙個節點的前驅:

node *tree_precessor(node *node)

return p;

}

找到乙個節點的後繼:

node *tree_successor(node *node)

return p;

}

要把乙個節點插入到樹中,先要找到它所在的位置,這個位置滿足兒二叉查詢樹的性質。

1. 找到它的父節點位置

2. 根據key與父節點key的關係,選擇插入

**如下:

node *tree_insert(node* tree, node *node)

node->right = node->left =

null;

node->p = p;

if(!p)

else

return tree;

}

節點的刪除稍微要分情況一下:

1. 當要刪除的結點沒有子樹時,直接給它父節點的響應指向賦值null即可。

2. 當要刪除的結點只有乙個子樹時, 把這個子樹鏈結到父節點上即可。

3. 當要刪除的結點同時有左右子樹時,把它的後繼節點替換到要刪除節點,然後刪除它的後繼節點。

所以應該按照下面的思路執行刪除:

1. 找到要刪除的節點:要刪除節點 或 它的後繼節點。

2. 刪除該節點。

3. 如果刪除的結點不是原來要刪除節點,則把刪除的結點的key替換到要刪除節點那裡。

**如下:

node* tree_delete(node* tree, node* node)

到這裡二叉查詢樹的基本操作就介紹完了。

二叉查詢樹在查詢效率上比較高,但是如果插入的元素按遞增或遞減的順序插入,那麼整棵樹就只有一條腿,插入多少就有多高,這樣下來查詢的效率還不如鍊錶來的快,也就是說這棵樹沒有自平衡的能力,下一節的紅黑樹很好的解決了這個問題。

最後,麻煩csdn別再刪除我寫的部落格了,至少刪的話給個原因再刪啊,弄的莫名其妙的。

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...

二叉樹 二叉查詢樹

二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...

樹(樹,二叉樹,二叉查詢樹)

1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...