python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)
轉自: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
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關文章
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹前序遍歷Python遞迴二叉樹
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 刷題系列 - Python用非遞迴實現二叉樹後續遍歷Python遞迴二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- 二叉樹的建立與遍歷(遞迴實現)二叉樹遞迴
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 【Java資料結構與演算法筆記(二)】樹的四種遍歷方式(遞迴&非遞迴)Java資料結構演算法筆記遞迴
- 非遞迴實現先序遍歷和中序遍歷遞迴
- Day14 | 二叉樹遞迴遍歷二叉樹遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- 資料結構初階--二叉樹(前中後序遍歷遞迴+非遞迴實現+相關求算結點實現)資料結構二叉樹遞迴
- 遞迴遍歷樹狀結構優雅實現遞迴
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- 二叉平衡樹 python 列表 遞迴Python遞迴
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- js遞迴遍歷講解JS遞迴
- [work] python巢狀字典的遞迴遍歷Python巢狀遞迴
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- 刷題系列 - Python用遞迴實現求二叉樹深度Python遞迴二叉樹
- 迴圈遍歷二叉樹二叉樹
- 遞迴遍歷網站所有 url遞迴網站
- 遞迴和非遞迴分別實現求n的階乘遞迴