不知道為什麼,之前寫的二叉查詢樹被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 ...