概述
二叉树,作为数据结构中重要的一员,掌握好其相关算法是非常有必要的。在本博客中,我将会用python实现二叉树的前序、中序以及后序遍历,同时也实现了利用前序+中序求后序,或者利用中序+后序求前序等相关操作。
代码
话不多说,下面直接给代码,所有算法都用递归的方式求解,所以本身逻辑并不复杂,此处就不再详细解释其算法原理。
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class Traversal:
def pre_order(self, root):
if root:
print(root.value, end=" ")
self.pre_order(root.left)
self.pre_order(root.right)
def mid_order(self, root):
if root:
self.mid_order(root.left)
print(root.value, end=" ")
self.mid_order(root.right)
def post_order(self, root):
if root:
self.post_order(root.left)
self.post_order(root.right)
print(root.value, end=" ")
class Solution:
def get_post(self, pre_order, mid_order):
if not pre_order:
return
root = Node(pre_order[0])
pos = mid_order.index(pre_order[0])
root.left = self.get_post(pre_order[1:pos+1], mid_order[0:pos])
root.right = self.get_post(pre_order[pos+1:], mid_order[pos+1:])
return root
def get_pre(self, mid_order, post_order):
if not post_order:
return
root = Node(post_order[-1])
pos = mid_order.index(post_order[-1])
root.left = self.get_pre(mid_order[:pos], post_order[:pos])
root.right = self.get_pre(mid_order[pos+1:], post_order[pos:-1])
return root
if __name__ == "__main__":
# make a tree
# root --> 0
# / \
# 1 2
# / \ / \
# 3 4 5 6
root = Node(0)
root.left = Node(1)
root.right = Node(2)
root.left.left = Node(3)
root.left.right = Node(4)
root.right.left = Node(5)
root.right.right = Node(6)
# test pre/mid/post traversal
print("pre_order: ", end=" ")
Traversal().pre_order(root)
print()
print("mid_order: ", end=" ")
Traversal().mid_order(root)
print()
print("post_order: ", end=" ")
Traversal().post_order(root)
print()
# test pre+mid ==> post
pre = [0,1,3,4,2,5,6]
mid = [3,1,4,0,5,2,6]
res = Solution().get_post(pre, mid)
print("post_order: ", end=" ")
Traversal().post_order(res)
print()
# test mid+post ==> pre
mid = [3,1,4,0,5,2,6]
post = [3,4,1,5,6,2,0]
res = Solution().get_pre(mid, post)
print("pre_order: ", end=" ")
Traversal().pre_order(res)
# res
#
# pre_order: 0 1 3 4 2 5 6
# mid_order: 3 1 4 0 5 2 6
# post_order: 3 4 1 5 6 2 0
# post_order: 3 4 1 5 6 2 0
# pre_order: 0 1 3 4 2 5 6
#
总结
不忘初心,砥砺前行!