python 實現二叉樹
阿新 • • 發佈:2018-12-07
以上為按層次生成的二叉樹。
關於二叉樹簡單的操作包括二叉樹節點的定義、二叉樹的生成、二叉樹的前序遍歷、中序遍歷、後序遍歷。
1.首先關於節點的定義:
""" @ python 二叉樹及其遍歷 @ author: blackzero """ ''' 1. 首先定義樹節點的型別 ''' class Node(object): # 定義初始化函式 # val 為節點的值,預設為-1 # lChild 為節點的左子樹,預設為None # rChild 為節點的右子樹,預設為None def __init__(self,val = -1,lChild = None,rChild = None): self.val = val self.lChild = lChild self.rChild = rChild
2. 定義樹型別的相關操作:
''' 2. 定義樹的型別 ''' class Tree(object): # 定義初始化函式 # 樹為空是,其根節點為一個空節點 # 這裡需要一個輔助佇列,協助樹的生成 def __init__(self): self.root = Node() self.Queue = [] # 新增子節點,也即生成樹,這是一種非常簡單的實現形式,按層次生成 def add(self, val): node = Node(val) if self.root.val == -1: # 如果當前的節點的val為-1 self.root = node # 則樹的root指標指向這個新生成的節點 self.Queue.append(self.root) # Queue用來裝載樹的節點 else: currentNode = self.Queue[0] # 獲取Queue中的第一個元素,也就是當前需要新增左、右子樹的節點 if currentNode.lChild == None: currentNode.lChild = node self.Queue.append(node) else: currentNode.rChild = node self.Queue.append(node) self.Queue.pop(0) # self.Queue.pop(0)的作用就是把佇列Queue中的第一個元素出佇列,這樣後面的節點就成為要構建子樹的根節點 # 前序遍歷 def preorder_traversal(self,root): # 這一句很關鍵,是遞迴停止的條件 if root == None: return print(root.val) self.preorder_traversal(root.lChild) self.preorder_traversal(root.rChild) # 中序遍歷 def inorder_traversal(self,root): if root == None: return self.inorder_traversal(root.lChild) print(root.val) self.inorder_traversal(root.rChild) # 後序遍歷 def postorder_traversal(self, root): if root == None: return self.postorder_traversal(root.lChild) self.postorder_traversal(root.rChild) print(root.val)
3. 驗證:
if __name__ == '__main__':
tree = Tree()
for i in range(10):
tree.add(i)
tree.preorder_traversal(tree.root)
print('*'*15)
tree.inorder_traversal(tree.root)
print('*' * 15)
tree.postorder_traversal(tree.root)
本文僅用遞迴的方法實現前序、中序、後序遍歷,還有迴圈、棧的方法實現,後續更新。
參考 九茶大佬的部落格