python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)

Candy_GL發表於2019-03-13

轉自:https://blog.csdn.net/lq_lq314/article/details/79176953

1、二叉樹的遍歷方式?

前序遍歷:根左右

中序遍歷:左根右

後序遍歷:左右根

層次遍歷:從上到下,從左到右

2、python新建一個二叉樹及其七種遍歷(遞迴和非遞迴)

class Node():
    #節點類
    def __init__(self,data = -1):
        self.data = data
        self.left = None
        self.right = None
class Tree():
    #樹類
    def __init__(self):
        self.root = Node()
 
    def add(self,data):
        # 為樹加入節點
        node  = Node(data)
        if self.root.data == -1:        #如果樹為空,就對根節點賦值
            self.root = node
        else:
            myQueue = []
            treeNode = self.root
            myQueue.append(treeNode)
            while myQueue:              #對已有的節點進行層次遍歷
                treeNode = myQueue.pop(0)
                if not treeNode.left:
                    treeNode.left = node
                    return
                elif not treeNode.right:
                    treeNode.right = node
                    return
                else:
                    myQueue.append(treeNode.left)
                    myQueue.append(treeNode.right)
 
    def pre_order_recursion(self,root):     #遞迴實現前序遍歷
        if not root:
            return
        print root.data,
        self.pre_order_recursion(root.left)
        self.pre_order_recursion(root.right)
 
    def pre_order_stack(self,root):         #堆疊實現前序遍歷(非遞迴)
        if not root:
            return
        myStack = []
        node = root
        while myStack or node:
            while node:       #從根節點開始,一直尋找他的左子樹
                print node.data,
                myStack.append(node)
                node = node.left
            node = myStack.pop()    #while結束表示當前節點node為空,即前一個節點沒有左子樹了
            node = node.right       #開始檢視它的右子樹
 
    def in_order_recursion(self,root):      #遞迴實現中序遍歷
        if not root:
            return
        self.in_order_recursion(root.left)
        print root.data,
        self.in_order_recursion(root.right)
 
    def in_order_stack(self,root):        #堆疊實現中序遍歷(非遞迴)
        if not root:
            return
        myStack = []
        node = root
        while myStack or node:     #從根節點開始,一直尋找它的左子樹
            while node:
                myStack.append(node)
                node = node.left
            node = myStack.pop()
            print node.data,
            node = node.right
 
 
    def post_order_recursion(self,root):     #遞迴實現後序遍歷
        if not root:
            return
        self.post_order_recursion(root.left)
        self.post_order_recursion(root.right)
        print root.data,
        
    def post_order_stack(self, root):  # 堆疊實現後序遍歷(非遞迴)
        # 先遍歷根節點,再遍歷右子樹,最後是左子樹,這樣就可以轉化為和先序遍歷一個型別了,最後只把遍歷結果逆序輸出就OK了。
        if not root:
            return
        myStack1 = []
        myStack2 = []
        node = root
        while myStack1 or node:
            while node:
                myStack2.append(node)
                myStack1.append(node)
                node = node.right
            node = myStack1.pop()
            node = node.left
        while myStack2:
            print myStack2.pop().data,
 
    def level_order_queue(self,root):       #佇列實現層次遍歷(非遞迴)
        if not root :
            return
        myQueue = []
        node = root
        myQueue.append(node)
        while myQueue:
            node = myQueue.pop(0)
            print node.data,
            if node.left:
                myQueue.append(node.left)
            if node.right:
                myQueue.append(node.right)
                
if __name__ == '__main__':
    #主函式
    datas = [2,3,4,5,6,7,8,9]
    tree = Tree()          #新建一個樹物件
    for data in datas:
        tree.add(data)      #逐個加入樹的節點
 
    print '遞迴實現前序遍歷:'
    tree.pre_order_recursion(tree.root)
 
    print '\n堆疊實現前序遍歷'
    tree.pre_order_stack(tree.root)
 
    print "\n\n遞迴實現中序遍歷:"
    tree.in_order_recursion(tree.root)
 
    print "\n堆疊實現中序遍歷:"
    tree.in_order_stack(tree.root)
 
    print '\n\n遞迴實現後序遍歷:'
    tree.post_order_recursion(tree.root)
 
    print '\n堆疊實現後序遍歷:'
    tree.post_order_stack(tree.root)
 
    print '\n\n佇列實現層次遍歷:'
    tree.level_order_queue(tree.root)
3、二叉樹的序列化和反序列化
1、二叉樹----->字串(序列化)

2、字串----->二叉樹(反序列化)

序列化的方式:

根據先序遍歷序列化

根據中序遍歷序列化

根據後序遍歷序列化

按層序列化

這裡以先序遍歷為例子:

假設序列化結果為str,初始str為空字串
先序遍歷二叉樹時如果遇到空節點,在str末端加上"#!"
如果遇到不為空的節點,假設節點值為3,就在str的末尾加上"3!"
(這裡加上!的原因是為了防止產生歧義,比如說12和1,2,序列化後都是12)

反序列化:

1、將字串轉化為陣列

1、選擇用什麼樣的遍歷方式序列化,就選擇用什麼樣的方式反序列化

2、一棵樹序列化的結果是唯一的,唯一的結果生成的二叉樹也是唯一的

按層遍歷的方式對二叉樹進行序列化

1、用佇列進行二叉樹的按層遍歷,即寬度優先遍歷。

2、除了訪問節點的順序是按層遍歷之外,對結果字串的處理,與之前介紹的處理方式一樣。
--------------------- 
作者:中南小鯊魚 
來源:CSDN 
原文:https://blog.csdn.net/lq_lq314/article/details/79176953 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關文章