程序猿,是灵长类动物的近亲,瞎长类动物。······ 每只程序猿自诞生起,就习惯在两棵树间跳来跳去,一棵是二叉树,另一棵也是二叉树。——摘自《暴走大事件》
二叉树的遍历
二叉树是一种非线性数据结构,遍历不像数组链表那样简单。之前我们讲到的数组链表都是线性数据结构,遍历比较简单。而二叉树遍历的时候需要把非线性关联的节点转化成一个线性的序列。不同的方式遍历二叉树,遍历出的序列顺序也是不同的。
宏观的角度来看,二叉树的遍历归结于两大类:深度优先遍历(前序遍历,中序遍历,后序遍历);广度优先遍历(层序遍历)。
深度优先遍历
前序遍历
前序遍历的输出顺序就是:根节点,左子树,右子树。
中序遍历
中序遍历的顺序是:左子树,根节点,右子树。
后序遍历
后序遍历的顺序是:左子树,右子树,根节点。
三种遍历的python代码:
class TreeNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def create_binary_tree(input_list=[]):
"""
构建二叉树
:param input_list: 输入数列
"""
if input_list is None or len(input_list) == 0:
return None
data = input_list.pop(0)
if data is None:
return None
node = TreeNode(data)
node.left = create_binary_tree(input_list)
node.right = create_binary_tree(input_list)
return node
def pre_order_traversal(node):
"""
前序遍历
:param node: 二叉树节点
"""
if node is None:
return
print(node.data)
pre_order_traversal(node.left)
pre_order_traversal(node.right)
return node
def in_order_traversal(node):
"""
中序遍历
:param node: 二叉树节点
"""
if node is None:
return
in_order_traversal(node.left)
print(node.data)
in_order_traversal(node.right)
return node
def post_order_traversal(node):
"""
后序遍历
:param node: 二叉树节点
"""
if node is None:
return
post_order_traversal(node.left)
post_order_traversal(node.right)
print(node.data)
return node
my_input_list = list([3, 2, 9, None, None, 10, None, None, 8, None, 4])
root = create_binary_tree(my_input_list)
print("前序遍历:")
pre_order_traversal(root)
print("中序遍历:")
in_order_traversal(root)
print("后序遍历:")
post_order_traversal(root)