《資料結構與演算法分析》搜尋二叉樹詳解

2021-07-04 02:59:00 字數 1960 閱讀 3260

前言:

二叉樹這一章的內容實現相對於上一章難多了,不僅僅是想明白就一定能立刻寫出來,實現的時候會遇上許多沒有考慮周到的問題,需要在實現的時候再選擇乙個合適的解法。並且在編碼完之後,進行除錯的時候,同樣會遇到許多問題,比如樹斷裂了,對null指標進行了訪問,等等。這些問題都需要細心的好好檢查,除錯,解決。這一章的部落格本來上一周就該更新,不過為了實現這些頭疼的樹,讓我拖到了現在。

我的github:

原理:

二叉樹:

二叉樹(binary tree)的特點是每個結點至多具有兩棵子樹(即在二叉樹中不存在度大於2的結點),並且子樹之間有左右之分。

(1)、在二叉樹的第i層上至多有2i-1個結點(i≥1)。

(2)、深度為k的二叉樹至多有2k-1個結點(k≥1)。

(3)、對任何一棵二叉樹,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。

二叉查詢樹:

binarysearchtree,也叫二叉搜尋樹,或稱二叉排序樹(binary sort tree),是具有下列性質的二叉樹:

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

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

(3)、它的左、右子樹也分別為二叉查詢樹

操作:

插入:

二叉查詢樹的插入過程如下:1.若當前的二叉查詢樹為空,則插入的元素為根節點,2.若插入的元素值小於根節點值,則將元素插入到左子樹中,3.若插入的元素值不小於根節點值,則將元素插入到右子樹中。

searchtree insert(elementtype x, searchtree t)

else if(x< t->element)

else if(x>t->element)

return t;

}

刪除:

刪除的操作也是需要先找到節點,1.當前節點小於要刪除的資料時則走向右子樹;2.當前節點大於要刪除的資料則走向左子樹3.找到資料後刪除。

我的實現方式為遞迴刪除,找到的節點若有左右兩個子樹,則拿右子樹的最小值代替該節點,再刪除又子樹的最小值。

/*遞迴刪除*/

searchtree delete(elementtype x, searchtree t)

if(x< t->element)

t->lchild = delete(x, t->lchild);

else if(x> t->element)

t->rchild = delete(x, t->rchild);

else

else

}return t;

}

尋找:

尋找操作利用查詢二叉樹左小右大的性質,非常容易實現,我使用遞迴的方式實現查詢,非遞迴的方式實現尋找最大最小值

position find(elementtype x, searchtree t)

/*非遞迴查詢最小值*/

position findmin(searchtree t)

return null;

}/*非遞迴查詢最大值*/

position findmax(searchtree t)

return null;

}

總結:

二叉查詢樹是樹結構中最基礎的一種,只有完全理解並且能實現它之後,才能做好之後的更難的樹的實現。該樹由於不能保持左右的平衡,所以實際上不能直接拿來使用,需要進一步改進。

資料結構 搜尋二叉樹

它要麼是一顆空樹,要麼是具有以下性質的一顆樹 1 每個節點都有乙個作為搜尋依據的關鍵碼 key 並且每個關鍵碼都不相同 2 左子樹上的所有節點的關鍵碼都小於根節點的關鍵碼 3 右子樹上的所有節點的關鍵碼都大於根節點的關鍵碼 4 左右子樹都是搜尋二叉樹 由於它亦是乙個二叉樹,所以一些拷貝構造,析構等的...

資料結構 搜尋二叉樹

手寫實現搜尋二叉樹 class treenode treenode left son null treenode right son null treenode p null 一定儲存雙親的指標 intvalue 0 bool treeinsert treenode proot,int value ...

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...