前言
本文為〈資料結構與演算法〉一文的學習筆記。
二元樹
二元樹(Binary tree)是每個節點最多只有兩個分支的樹結構。二元樹的分支具有左右次序,不能隨意顛倒。
二元樹有以下特性:
- 二元樹的節點個數可以為 0。
 
- 二元樹節點的最大分支度為 2。
 
- 二元樹的節點有左、右次序之分。
 
二元樹的走訪:
- 前序走訪(Pre-order):先根後左再右。
 
- 中序走訪(In-order):先左後根再右。
 
- 後序走訪(Post-order):先左後右再根。
 
函數實作
節點類別
一個 Node 類別的建構函式如下:
1 2 3 4 5 6 7 8
   | >>> class Node(object):         def __init__(self, data):                          self.data = data                          self.left = None                          self.right = None
   | 
 
新增節點
在 Node 類別建立一個 insert() 函式,以新增節點。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | >>> def insert(self, data):                  if self.data == data:             return False                  elif data < self.data:             if self.left:                 return self.left.insert(data)             else:                 self.left = Node(data)                 return True                  else:             if self.right:                 return self.right.insert(data)             else:                 self.right = Node(data)                 return True
   | 
 
查找節點
在 Node 類別建立一個 find() 函式,以查找節點。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | def find(self, data):          if data == self.data:         return True          elif data < self.data:                  if self.left:             return self.left.find(data)                  else:             return False          else:                  if self.right:             return self.right.find(data)                  else:             return False
   | 
 
印出節點
在 Node 類別建立 pre_order()、in_order() 與 post_order() 函式,以印出節點。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
   | >>> def pre_order(self):                   if self:                          print(str(self.data), end = ' ')                          if self.left:                 self.left.pre_order()                          if self.right:                 self.right.pre_order()
  >>> def in_order(self):                   if self:                          if self.left:                 self.left.in_order()                          print(str(self.data), end = ' ')                          if self.right:                 self.right.in_order()
  >>> def post_order(self):                   if self:                          if self.left:                 self.left.post_order()                          if self.right:                 self.right.post_order()                          print(str(self.data), end = ' ')
   | 
 
樹類別
一個 Tree 類別的基本函式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
   | class Tree(object):     def __init__(self):         self.root = None
           def insert(self, data):                  if self.root:             return self.root.insert(data)                  else:             self.root = Node(data)             return True
           def find(self, data):                  if self.root:             return self.root.find(data)                  else:             return False
           def pre_order(self):         print()                  if self.root is not None:             print('Pre-order: ')             self.root.pre_order()
           def in_order(self):         print()                  if self.root is not None:             print('In-order: ')             self.root.in_order()
           def post_order(self):         print()                  if self.root is not None:             print('Post-order: ')             self.root.post_order()
   | 
 
實例化一個 Tree 類別。
新增幾個節點。
1 2 3 4 5 6 7 8 9
   | >>> tree.insert(10)     tree.insert(12)     tree.insert(5)     tree.insert(4)     tree.insert(20)     tree.insert(8)     tree.insert(7)     tree.insert(15)     tree.insert(13)
   | 
 
查找節點
1 2 3 4
   | >>> print(tree.find(1)) False >>> print(tree.find(12)) True
   | 
 
前序走訪。
1 2 3
   | >>> tree.pre_order() Pre-order: 10 5 4 8 7 12 20 15 13
   | 
 
中序走訪。
1 2 3
   | >>> tree.in_order() In-order: 4 5 7 8 10 12 13 15 20
   | 
 
後序走訪。
1 2 3
   | >>> tree.post_order() Post-order: 4 7 8 5 13 15 20 12 10
   | 
 
程式碼
參考資料