每一次寫部落格都有乙個前言,這個前言雖然沒有介紹什麼具體的知識內容。但是可以記錄我當前面臨的困境和事情,也可以作為自己的乙個心路歷程來記錄吧。最近在看stl,看到紅黑樹這一部分的時候,突然想起來之前資料結構裡面的二叉排序樹還沒有實現,就突發奇想將這一部分寫出來。另外也是對自己的資料結構的乙個複習,為後面的實習找工作做準備吧。
一棵空樹,或者是具有下列性質的二叉樹 :若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
左、右子樹也分別為二叉排序樹;
沒有鍵值相等的結點。
這就是一棵二叉排序樹,我們對於他的主要操作就是查詢和插入,再加上乙個max和min操作。
首先,查詢就是和根結點比較如果比根結點大就轉向右子樹,比根結點小就轉向左子樹。直到找到目標結點或者找到結點為空。插入操作首先是找到應該查詢的位置,然後將結點放置於目標位置,這個結合**更好理解。
但是這裡面的max和min和普通的方法不一樣,對於max來說就是一直找結點的右子樹,直到找到沒有右子樹的結點為止;相應的min就是一直找結點的左子樹,直到找到沒有左子樹的結點為止。時間複雜度應該是
o(logn)
二叉排序樹的結構和二叉樹的結構完全一致,
結點結構如下:class
search_tree};
typedef node *point_node;
struct node* head;
void
_insert
(point_node &point,
const
int& val)
;bool
_find
(point_node point,
const
int& val)
;int
_max
(point_node point)
;int
_min
(point_node point)
;public
:void
insert
(const
int& val)
;bool
find
(const
int& val)
;int
max();
intmin()
;search_tree()
:head
(nullptr)}
;
對於結點來說,我們新建乙個結點的時候呼叫有參建構函式將其中的data進行初始化,然後lchild和rchild初始化為
nullptr
。其中有幾個比較特殊的函式:_insert(),_find(),_max(),_min()
這四個函式是對應函式的內部實現方法,這樣可以避免對外的函式過於複雜。而且這幾個函式都是通過迭代實現相應的功能的。首先是比較簡單的幾個
public函式
這些函式是對外的介面,這四個函式呼叫對於的內部實現函式。void search_tree::
insert
(const
int& val)
bool search_tree::
find
(const
int& val)
int search_tree::
min(
)int search_tree::
max(
)
四個內部實現函式:
這裡面比較有難度是int search_tree::
_max
(point_node point)
else
}int search_tree::
_min
(point_node point)
else
}bool search_tree::
_find
(point_node point,
const
int& val)
}void search_tree::
_insert
(point_node &point,
const
int& val)
else
}
insert()
這個函式使用的引數是引用,可以直接修改其父節點的左右孩子指標。這樣可以實現通過遞迴修改父節點的引數。其中乙個為了避免樹**現重複結點則,當出現樹中結點的data
和val
相等時就停止當前函式不再進行後續的操作,這樣就避免了出現重複元素。這個二叉樹的結構是int
main()
執行結果是:
其實這個內容也很簡單一直沒得動力來實現這個函式,以後我每一次完成這一類的知識我都來寫一篇部落格,作為自己前進的動力,加油!
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...
二叉排序樹
include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...