一.算法要求
给定一棵二叉树,分别使用前序,中序,后序遍历二叉树
二.二叉树遍历
1.定义
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点,一般一个二叉树由根节点,左子树,右子树构成,最下面的节点也常称为叶节点。

2.前序遍历
Root-Left-Right 根左右,按照这个规则递归即可,这里给出前序遍历的具体操作,中序和后序可以自己实现
示例:
Step1: 根 Root,左 A Root-A
Step2: A 的左非None,到达C Root-A-C
Step3: C的左非None,到达G Root-A-C-G
Step4: 根C,左G已遍历,根据根左右,所以下一个遍历右H Root-A-C-G-H
Step5: C数遍历完毕,递归退回A树,遍历A树的右D Root-A-C-G-H-D
Step6: 左边所有节点遍历完毕,到达Root的右节点 B Root-A-C-G-H-D-B
Step7: B的左节点为E,E的左节点没有,右节点为I Root-A-C-G-H-D-B-I
Step8: E树遍历完毕,退回B树,B树右节点F,退回Root,遍历完毕 Root-A-C-G-H-D-B-I-F
前序遍历: Root A C G H D B E I F
3.中序遍历
Left-Root-Right 左根右,按照这个规则递归即可
中序遍历: G C H A D Root E I B F
4.后序遍历
Left-Right-Root 左右根,按照这个规则递归即可
后序遍历: G H C D A I E F B Root
5.代码实现
代码采用递归实现,每个节点有 Data 节点数据,Left 左子树,Right 右子树三个结构,前序遍历按照根左右,先遍历根节点,再递归遍历左右根节点,中序遍历和后序遍历实现相近,只是顺序不同,分别为左根右和左右根
class BinaryTree(object):
# 初始化
def __init__(self, data=None, left=None, right=None):
self.data = data
self.left = left
self.right = right
# 前序遍历 Root-Left-Right 根左右
def pre_order(self):
if self.data is not None:
print(self.data, end=' ')
if self.left is not None:
self.left.pre_order()
if self.right is not None:
self.right.pre_order()
# 中序遍历 Left-Root-Right 左根右
def mid_order(self):
if self.left is not None:
self.left.mid_order()
if self.data is not None:
print(self.data, end=' ')
if self.right is not None:
self.right.mid_order()
# 后序遍历 Left-Right-Root 左右根
def post_order(self):
if self.left is not None:
self.left.post_order()
if self.right is not None:
self.right.post_order()
if self.data is not None:
print(self.data, end=' ')
如果想获取上图示例二叉树可以执行如下代码:
tree_A = BinaryTree("A")
tree_B = BinaryTree("B")
tree_C = BinaryTree("C")
tree_D = BinaryTree("D")
tree_E = BinaryTree("E")
tree_F = BinaryTree("F")
tree_G = BinaryTree("G")
tree_H = BinaryTree("H")
tree_I = BinaryTree("I")
tree = BinaryTree("Root", tree_A, tree_B)
tree_A.left = tree_C
tree_A.right = tree_D
tree_B.left = tree_E
tree_B.right = tree_F
tree_C.left = tree_G
tree_C.right = tree_H
tree_E.right = tree_I