python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)
阿新 • • 發佈:2019-02-18
1、二叉樹的遍歷方式?
前序遍歷:根左右
中序遍歷:左根右
後序遍歷:左右根
層次遍歷:從上到下,從左到右
2、python新建一個二叉樹及其七種遍歷(遞迴和非遞迴)
3、二叉樹的序列化和反序列化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)
1、二叉樹----->字串(序列化)
2、字串----->二叉樹(反序列化)
序列化的方式:
根據先序遍歷序列化
根據中序遍歷序列化
根據後序遍歷序列化
按層序列化
這裡以先序遍歷為例子:
- 假設序列化結果為str,初始str為空字串
- 先序遍歷二叉樹時如果遇到空節點,在str末端加上"#!"
- 如果遇到不為空的節點,假設節點值為3,就在str的末尾加上"3!"
(這裡加上!的原因是為了防止產生歧義,比如說12和1,2,序列化後都是12)
反序列化:
1、將字串轉化為陣列
1、選擇用什麼樣的遍歷方式序列化,就選擇用什麼樣的方式反序列化
2、一棵樹序列化的結果是唯一的,唯一的結果生成的二叉樹也是唯一的
按層遍歷的方式對二叉樹進行序列化
1、用佇列進行二叉樹的按層遍歷,即寬度優先遍歷。
2、除了訪問節點的順序是按層遍歷之外,對結果字串的處理,與之前介紹的處理方式一樣。