資料結構筆記 二叉樹及其實現 python

2021-09-01 22:31:26 字數 2774 閱讀 3437

二叉樹是一種最簡單的樹形結構,其特點是樹中每個結點至多關聯到兩個後繼結點,也就是,乙個節點可以關聯到的結點可以為0,1,2,這也是二叉樹乙個節點度的定義,另乙個特點是結點關聯的後繼結點明確的分左右,一般有乙個根結點,然後根結點的左右後繼結點分別稱為根結點的左,右孩子,或者左,右關聯結點。

二叉樹是結點的有窮集合。這個集合或者是空集,或者其中有乙個稱為根結點的特殊結點,其餘結點分屬兩顆不相交的二叉樹,這兩顆二叉樹分別是原二叉樹的左,右子樹。(顯然,二叉樹的定義是一種遞迴定義,所以接下來的二叉樹也用遞迴實現)

對於一顆高度為h的二叉樹,如果0至h-1層的節點都滿(第i層有2^i個結點),如果下一層結點不滿,則所有結點在最左邊連續排列,空位都在右邊,這樣的樹稱為完全二叉樹。

1):在非空二叉樹的第i層至少有 2^i 個1結點(i≥0) 

第0層有2^0=1個結點,第1層有2^1=2個結點,假設第n層有2^n個結點,每個結點最多有兩個子節點,所以n+1層至多有2^n * 2 = 2^(n+1)個結點,運用歸納法證畢。

2):高度為h的二叉樹至多有2^(h+1)-1個結點(h大於等於0)

第0層最多2^0=1個,第二層最多2^1=2,以此類推,高度h的二叉樹共2^0+2^1+……+2h,等比數列求和,帶公式即可得出結論。

3):對於一顆滿二叉樹,度為0的結點(葉節點)總比度為2的結點多乙個

用n0,n1,n2分別表示度為0,1,2的結點數,n表示整個整個二叉樹的結點數,則n = n0+n1+n2,又根據結點的性質(所有節點的讀書之和+1=結點總數),可得n = n1 + 2*n2 +1 ,兩個式子做減法,就能得到最後結論,n0=n2+1。

4):一顆完全二叉樹的高度h=|log2(n)|,即不大於log2(n)的最大整數

假設完全二叉樹有n個結點1,高度為h,根據性質2),2^h-15):n各結點的完全二叉樹的結點按層次並按從左到右的順序從0開始編號,對任一結點 i(0≤i≤n-1):

△ 序號為0的結點是根

△ 對於i>0,其父節點編號(i-1)/ 2

△ 若2 x i + 1 < n ,其左子節點序號為 2 x i + 1,否則無左子節點

△ 若2 x i + 2 < n ,其右子節點序號為 2 x i + 2,否則無右子節點

將陣列1,2,3,4,5,6,7,8,9,10轉換為二叉樹

將陣列中心元素作為二叉樹根結點,把陣列分為兩部分,對於陣列的兩部分採用相同的構造方法,遞迴的實現二叉樹。

#構建二叉樹類

class bitnode:

def __init__(self):

self.data = none

self.lchild = none

self.rchild = none

#把有序陣列轉換為二叉樹

def array2tree(arr,start,end):

root = none

if end >= start:

root = bitnode();

mid = int((start+end+1)/2) #取整

#樹的根節點為陣列中間的元素

root.data = arr[mid]

#遞迴用左半部分構造root的左子樹

root.lchild = array2tree(arr,start,mid-1)

#遞迴用左半部分構造root的右子樹

root.rchild = array2tree(arr,mid+1,end)

else:

root = none

return root

通過引入佇列,在遍歷每個結點的過程中記錄結點的左右子結點資訊,遍歷直到樹為空,先遍歷根結點,然後將左右子結點加入佇列,繼續遍歷佇列中下乙個元素,如果有結點,按左右結點順序加入佇列,遍歷直到隊列為空,沒有新的元素增加。

from collections import deque

#用層序方法遍歷二叉樹

def printtreelayer(root):

if root == none:

return

queue = deque()

#根節點進入佇列

while len(queue) > 0:

#訪問當前節點

p = queue.popleft()

print(p.data,end = ' ')

#如果左孩子不為空則加入佇列

if p.lchild != none:

#如果右孩子不為空則加入佇列

if p.rchild != none:

print()

if __name__ == "__main__":

arr = [1,2,3,4,5,6,7,8,9,10]

root = array2tree(arr,0,len(arr)-1)

print('層序遍歷結果為:')

printtreelayer(root)

層序遍歷結果為:

6 3 9 2 5 8 10 1 4 7

二叉樹及其實現

樹概念 節點n1到nk的路徑 為節點n1 n2 nk的乙個序列,是的對於1 i 路徑的長 路徑上邊的條數,如上面為k 1 ni的深度 從根到ni的唯一路徑的長。根的深度為0 ni的高度 從ni到一片葉子的最長路徑的長。樹葉的高度為0,一棵樹的高度等於根的高,通常定義空樹的高為 1 二叉樹的節點宣告 ...

資料結構筆記 樹 二叉樹 滿二叉樹

二叉樹滿二叉樹 樹是n n 0 個結點的有限集。結點為零的樹為空樹。任意一棵非空樹中 1.有且有乙個特定的稱為根的結點 2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每乙個集合又是一棵樹,並稱為根的子樹。1.結點擁有的子樹數稱為結點的度 2.度為0的結點稱為葉結點或分支結點,除根...

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...