1. 程式人生 > >python 實現二叉樹

python 實現二叉樹

以上為按層次生成的二叉樹。

關於二叉樹簡單的操作包括二叉樹節點的定義、二叉樹的生成、二叉樹的前序遍歷、中序遍歷、後序遍歷。

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)

本文僅用遞迴的方法實現前序、中序、後序遍歷,還有迴圈、棧的方法實現,後續更新。

參考

九茶大佬的部落格