python實現二叉樹和它的七種遍曆

來源:互聯網
上載者:User

標籤:python   樹   遍曆   

介紹:

樹是資料結構中非常重要的一種,主要的用途是用來提高尋找效率,對於要重複尋找的情況效果更佳,如二叉排序樹、FP-樹。另外可以用來提高編碼效率,如哈弗曼樹。


代碼:

用python實現樹的構造和幾種遍曆演算法,雖然不難,不過還是把代碼作了一下整理總結。實現功能:

  • 樹的構造
  • 遞迴實現先序遍曆、中序遍曆、後序遍曆
  • 堆棧實現先序遍曆、中序遍曆、後序遍曆
  • 隊列實現層次遍曆
#coding=utf-8class Node(object):    """節點類"""    def __init__(self, elem=-1, lchild=None, rchild=None):        self.elem = elem        self.lchild = lchild        self.rchild = rchildclass Tree(object):    """樹類"""    def __init__(self):        self.root = Node()    def add(self, elem):        """為樹添加節點"""        node = Node(elem)        if self.root.elem == -1:            #如果樹是空的,則對根節點賦值            self.root = node        else:                                 myQueue = []            treeNode = self.root            myQueue.append(treeNode)            while myQueue:                      #對已有的節點進行層次遍曆                treeNode = myQueue.pop(0)                if treeNode.lchild == None:                    treeNode.lchild = node                    return                elif treeNode.rchild == None:                    treeNode.rchild = node                    return                else:                    myQueue.append(treeNode.lchild)                    myQueue.append(treeNode.rchild)    def front_digui(self, root):        """利用遞迴實現樹的先序遍曆"""        if root == None:            return        print root.elem,        self.front_digui(root.lchild)        self.front_digui(root.rchild)    def middle_digui(self, root):        """利用遞迴實現樹的中序遍曆"""        if root == None:            return        self.middle_digui(root.lchild)        print root.elem,        self.middle_digui(root.rchild)    def later_digui(self, root):        """利用遞迴實現樹的後序遍曆"""        if root == None:            return        self.later_digui(root.lchild)        self.later_digui(root.rchild)        print root.elem,    def front_stack(self, root):        """利用堆棧實現樹的先序遍曆"""        if root == None:            return        myStack = []        node = root        while node or myStack:            while node:                     #從根節點開始,一直找它的左子樹                print node.elem,                myStack.append(node)                node = node.lchild            node = myStack.pop()            #while結束表示當前節點node為空白,即前一個節點沒有左子樹了            node = node.rchild                  #開始查看它的右子樹    def middle_stack(self, root):        """利用堆棧實現樹的中序遍曆"""        if root == None:            return        myStack = []        node = root        while node or myStack:            while node:                     #從根節點開始,一直找它的左子樹                myStack.append(node)                node = node.lchild            node = myStack.pop()            #while結束表示當前節點node為空白,即前一個節點沒有左子樹了            print node.elem,            node = node.rchild                  #開始查看它的右子樹    def later_stack(self, root):        """利用堆棧實現樹的後序遍曆"""        if root == None:            return        myStack1 = []        myStack2 = []        node = root        myStack1.append(node)        while myStack1:                   #這個while迴圈的功能是找出後序遍曆的逆序,存在myStack2裡面            node = myStack1.pop()            if node.lchild:                myStack1.append(node.lchild)            if node.rchild:                myStack1.append(node.rchild)            myStack2.append(node)        while myStack2:                         #將myStack2中的元素出棧,即為後序遍曆次序            print myStack2.pop().elem,    def level_queue(self, root):        """利用隊列實現樹的層次遍曆"""        if root == None:            return        myQueue = []        node = root        myQueue.append(node)        while myQueue:            node = myQueue.pop(0)            print node.elem,            if node.lchild != None:                myQueue.append(node.lchild)            if node.rchild != None:                myQueue.append(node.rchild)if __name__ == ‘__main__‘:    """主函數"""    elems = range(10)           #產生十個資料作為樹節點    tree = Tree()          #建立一個樹對象    for elem in elems:                          tree.add(elem)           #逐個添加樹的節點    print ‘\n隊列實現層次遍曆:‘    tree.level_queue(tree.root)    print ‘\n\n遞迴實現先序遍曆:‘    tree.front_digui(tree.root)    print ‘\n遞迴實現中序遍曆:‘     tree.middle_digui(tree.root)    print ‘\n遞迴實現後序遍曆:‘    tree.later_digui(tree.root)    print ‘\n\n堆棧實現先序遍曆:‘    tree.front_stack(tree.root)    print ‘\n堆棧實現中序遍曆:‘    tree.middle_stack(tree.root)    print ‘\n堆棧實現後序遍曆:‘    tree.later_stack(tree.root)


總結:

樹的遍曆主要有兩種,一種是深度優先遍曆,像前序、中序、後序;一種是廣度優先遍曆,像層次遍曆。兩者的區別還不是非常明顯,但從樹擴充到有向圖,到無向圖的時候,深度優先搜尋和廣度優先搜尋的效率和作用還是有很大不同的。
深度優先一般用遞迴,廣度優先一般用隊列。一般情況下能用遞迴實現的演算法大部分也能用堆棧來實現。

我印象中是有遞迴構造樹的方法,卻一直想不出該怎麼構造。後來仔細想了一下,遞迴思想有點類似深度優先演算法,而樹的構造應該是廣度優先的。如果用遞迴的話一定要有個終止條件,例如規定樹深等。不然構造出來的樹會偏向左單子樹或者右單子樹。所以一般樹的構造還是應該用隊列比較好。



以上說的不夠嚴謹,有錯誤之處,歡迎指正!

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

python實現二叉樹和它的七種遍曆

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.