二叉排序樹

2021-10-03 12:31:09 字數 2864 閱讀 5999

每一次寫部落格都有乙個前言,這個前言雖然沒有介紹什麼具體的知識內容。但是可以記錄我當前面臨的困境和事情,也可以作為自己的乙個心路歷程來記錄吧。最近在看stl,看到紅黑樹這一部分的時候,突然想起來之前資料結構裡面的二叉排序樹還沒有實現,就突發奇想將這一部分寫出來。另外也是對自己的資料結構的乙個複習,為後面的實習找工作做準備吧。

一棵空樹,或者是具有下列性質的二叉樹 :

若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

左、右子樹也分別為二叉排序樹;

沒有鍵值相等的結點。

這就是一棵二叉排序樹,我們對於他的主要操作就是查詢插入,再加上乙個maxmin操作。

首先,查詢就是和根結點比較如果比根結點大就轉向右子樹,比根結點小就轉向左子樹。直到找到目標結點或者找到結點為空。插入操作首先是找到應該查詢的位置,然後將結點放置於目標位置,這個結合**更好理解。

但是這裡面的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()這個函式使用的引數是引用,可以直接修改其父節點的左右孩子指標。這樣可以實現通過遞迴修改父節點的引數。其中乙個為了避免樹**現重複結點則,當出現樹中結點的dataval相等時就停止當前函式不再進行後續的操作,這樣就避免了出現重複元素。

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 ...