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、除了訪問節點的順序是按層遍歷之外,對結果字符串的處理,與之前介紹的處理方式一樣。