前言:
二叉樹這一章的內容實現相對於上一章難多了,不僅僅是想明白就一定能立刻寫出來,實現的時候會遇上許多沒有考慮周到的問題,需要在實現的時候再選擇乙個合適的解法。並且在編碼完之後,進行除錯的時候,同樣會遇到許多問題,比如樹斷裂了,對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 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...