樹和二叉樹簡介

付威的網路部落格發表於2019-07-20

一、樹

1、什麼是樹?

樹狀圖是一種資料結構,它是由n(n>=1)個有限節點組成一個具有層次關係的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:

每個節點有零個或多個子節點;沒有父節點的節點稱為根節點;每一個非根節點有且只有一個父節點;除了根節點外,每個子節點可以分為多個不相交的子樹;

樹和二叉樹簡介

樹(tree)是包含n(n>0)個結點的有窮集,其中:

(1)每個元素稱為結點(node);

(2)有一個特定的結點被稱為根結點或樹根(root)。

(3)除根結點之外的其餘資料元素被分為m(m≥0)個互不相交的集合T1,T2,……Tm-1,其中每一個集合Ti(1<=i<=m)本身也是一棵樹,被稱作原樹的子樹(subtree)。

2、相關術語

節點的度:一個節點含有的子樹的個數稱為該節點的度;

葉節點或終端節點:度為0的節點稱為葉節點;

非終端節點或分支節點:度不為0的節點;

雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點;

孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點;

兄弟節點:具有相同父節點的節點互稱為兄弟節點;

樹的度:一棵樹中,最大的節點的度稱為樹的度;

節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;

樹的高度或深度:樹中節點的最大層次;

堂兄弟節點:雙親在同一層的節點互為堂兄弟;

節點的祖先:從根到該節點所經分支上的所有節點;

子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。

森林:由m(m>=0)棵互不相交的樹的集合稱為森林;

二、二叉樹

1、什麼是二叉樹?

二叉樹,就是度不差過2的樹(節點最多有兩個叉)

樹和二叉樹簡介

三、兩種特殊的二叉樹

1、滿二叉樹

一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。

2、完全二叉樹

葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹

樹和二叉樹簡介

滿二叉樹一定是完全二叉樹,但是完全二叉樹不一定是滿二叉樹

四、二叉樹的儲存方式

1、鏈式儲存方式

a、二叉樹的鏈式儲存:將二叉樹的節點定義為一個物件,節點之間通過類似連結串列的連結方式來連線。

b、節點定義

class BiTreeNode:
   def __init__(self,data):  #data就是傳進去的節點的值
       self.data = data
       self.lchild = None
       self.rchild = None
複製程式碼

c、二叉樹的遍歷:

I 、先(前)序遍歷:訪問根結點的操作發生在遍歷其左右子樹之前

  具體操作:若二叉樹非空,則依次執行如下操作:

⑴ 訪問根結點;

⑵ 遍歷左子樹;

⑶ 遍歷右子樹。

II、中序遍歷:訪問根結點的操作發生在遍歷其左右子樹之中(間)。

 具體操作: 若二叉樹非空,則依次執行如下操作:
複製程式碼

⑴遍歷左子樹;

⑵訪問根結點;

⑶遍歷右子樹。

III、後序遍歷:訪問根結點的操作發生在遍歷其左右子樹之後。

  若二叉樹非空,則依次執行如下操作:
複製程式碼

⑴遍歷左子樹;

⑵遍歷右子樹;

⑶訪問根結點。

IV、層次遍歷

用一個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。 二叉樹的遍歷程式碼如下

from collections import deque   #雙向佇列
from queue import Queue    #單向佇列

# import queue
# q = queue.Queue()
# q.put('ggg')
# q.get()
class BiTreeNode:
   def __init__(self,data):
       self.data = data
       self.lchild = None
       self.rchild = None

   @classmethod
   def pre_order(self,root):
       '''前序遍歷(根左右)'''
       if root: #如果有根節點
           print(root.data,end='')
           self.pre_order(root.lchild)
           self.pre_order(root.rchild)

   @classmethod
   def in_order(self,root):
       '''中序遍歷(左根右)'''
       if root:
           self.in_order(root.lchild)
           print(root.data,end='')
           self.in_order(root.rchild)

   @classmethod
   def out_order(self, root):
       '''後序遍歷(左右根)'''
       if root:
           self.out_order(root.lchild)
           self.out_order(root.rchild)
           print(root.data, end='')

   @classmethod
   def level_order(self,root):
       '''層次遍歷(第一層,第二層,第三層...藉助佇列來實現)'''
       queue = deque()
       queue.append(root)
       while len(queue) > 0:
           node = queue.popleft()
           print(node.data,end='')
           if node.lchild:
               queue.append(node.lchild)
           if node.rchild:
               queue.append(node.rchild)

#建立二叉樹
a = BiTreeNode("A")
b = BiTreeNode("B")
c = BiTreeNode("C")
d = BiTreeNode("D")
e = BiTreeNode("E")
f = BiTreeNode("F")
g = BiTreeNode("G")
e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f
root = e

#檢視前序遍歷的結果
BiTreeNode.pre_order(root)   #EACBDGF
print('')
BiTreeNode.in_order(root)    #ABCDEGF
print('')
BiTreeNode.out_order(root)  #BDCAFGE
print('')
BiTreeNode.level_order(root)  #EAGCFBD
複製程式碼

2、順序儲存方式

樹和二叉樹簡介

如上圖二叉樹標出了元素所對應的索引,那麼可以有一下結論

1、父節點和左孩子節點的編號下標有什麼關係?

如果已知父親節點為i,那麼他的左孩子節點為2i+1

樹和二叉樹簡介

2、父節點和右孩子節點的編號下標有什麼關係?

樹和二叉樹簡介

3、反過來知道孩子找父親

(n-1)/2=i # 左孩子求父節點

(n-2)/2=i # 右孩子求父節點

五、二叉搜尋樹

1、定義

二叉搜尋樹是一棵二叉樹且滿足性質:設X是二叉樹的一個節點。如果Y是X左子樹的一個節點,那麼Y.key <=X.key;

如果Y是X右子樹的一個節點,那麼Y.key>= X.key (X.key代表X節點對應的值)

通俗的說也就是 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉搜尋樹。

樹和二叉樹簡介

2、原理

二叉排序樹的查詢過程和次優二叉樹類似,通常採取二叉連結串列作為二叉排序樹的儲存結構。中序遍歷二叉排序樹可得到一個關鍵字的有序序列,一個無序序列可以通過構造一棵二叉排序樹變成一個有序序列,構造樹的過程即為對無序序列進行排序的過程。每次插入的新的結點都是二叉排序樹上新的葉子結點,在進行插入操作時,不必移動其它結點,只需改動某個結點的指標,由空變為非空即可。搜尋,插入,刪除的複雜度等於樹高,O(log(n)).

3、二叉搜尋樹的建立

可參考連結:visualgo.net/en/bst

4、二叉搜尋樹存在的問題

存在的問題:當插入的是有序的時候,假如插入的資料特別多,找是能找到,但是是很花費時間的。

可以有以下解決辦法:

  1、隨機化的二叉搜尋樹(打亂順序插入)

  2、AVL樹

查詢方法有:二分查詢、二叉搜尋樹、雜湊查詢、順序查詢、斐波那契查詢

六、AVL樹---擴充套件(瞭解)

1、AVL樹:AVL樹是一棵自平衡的二叉搜尋樹

2、AVL樹具有以下性質:  

根的左右子樹的高度只差的絕對值不能超過1

根的左右子樹都是平衡二叉樹

3、AVL的實現方式:旋轉

樹和二叉樹簡介

七、B樹 1、B樹:B樹是一棵自平衡的多路搜尋樹。常用於資料庫的索引

樹和二叉樹簡介

八、其他

樹和二叉樹簡介

樹和二叉樹簡介

識別圖中二維碼,領取python全套視訊資料

相關文章