二叉树是一种常用的数据结构,其基本样式大概如下图所示,这里不做过多介绍:
对于上图正常的一个满节点(以这棵树的根节点A为例),A为根节点、B为左节点、E为右节点,其他节点类似。二叉树遍历分为三种:前序、中序、后序,对于上面节点来说,前序顺序是ABE(根节点排最先,然后同级先左后右);中序顺序是BAE(先左后根最后右);后序顺序是BEA(先左后右最后根)。而对于整个树形结构,B表示的是以B为根节点下面对应的子树,同样E表示的是以E为根节点对应下面的子树,因此上图二叉树的遍历结果为:
- 前序遍历:ABCDEFGHK
- 中序遍历:BDCAEHGKF
- 后序遍历:DCBHKGFEA
为了进一步说明上述遍历结果的由来,可以参考下面说明(以中序为例,其他两种类似):
对于一棵二叉树,其根节点课表示成如下方式:
'''
根节点表示方法
'''
class BiTreeNode:
def __init__(self, data):
self.data = data
self.lchild = None #左孩子
self.rchild = None #右孩子
对于上面的树结构,表示如下:
'''
所有的根节点
'''
a = BiTreeNode('A')
b = BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')
h = BiTreeNode('H')
k = BiTreeNode('K')
'''
各节点之间的关系
'''
a.lchild=b
a.rchild=e
b.rchild=c
c.lchild=d
e.rchild=f
f.lchild=g
g.lchild=h
g.rchild=k
利用递归的思想实现上述三种遍历,其中:
- 前序遍历(根、左、右):
def pre_order(root):
if root:
print(root.data, end='')
pre_order(root.lchild)
pre_order(root.rchild)
- 中序遍历(左、根、右):
def in_order(root):
if root:
in_order(root.lchild)
print(root.data, end='')
in_order(root.rchild)
后序遍历(左、右、根):
def post_order(root):
if root:
post_order(root.lchild)
post_order(root.rchild)
print(root.data, end='')
补充:层次遍历
层次遍历就是按照从上到下,从左到右的顺序遍历一棵树,对于上述树结构,层次遍历的结果为:ABECFDGHK。对于这种遍历可以采用队列(先入先出)的方式实现,先将根节点入队列,当队列不为空时,出队列一个,并把出队列的左右子节点放入队列中,重复上述过程。程序具体实现如下:
def level_order(root):
q=deque()
q.append(root)
while len(q)>0:
x=q.popleft()
print(x.data,end='')
if x.lchild:
q.append(x.lchild)
if x.rchild:
q.append(x.rchild)