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

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、字符串----->二叉樹(反序列化)

序列化的方式:

根據先序遍歷序列化

根據中序遍歷序列化

根據後序遍歷序列化

按層序列化

這裏以先序遍歷爲例子:

  1. 假設序列化結果爲str,初始str爲空字符串
  2. 先序遍歷二叉樹時如果遇到空節點,在str末端加上"#!"
  3. 如果遇到不爲空的節點,假設節點值爲3,就在str的末尾加上"3!"

(這裏加上!的原因是爲了防止產生歧義,比如說12和1,2,序列化後都是12)

反序列化:

1、將字符串轉化爲數組

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

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

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

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

2、除了訪問節點的順序是按層遍歷之外,對結果字符串的處理,與之前介紹的處理方式一樣。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章