数据结构与算法1:二叉树(binary_tree)的前、中、后序(深度优先)和广度优先遍历及python代码实现
程序员文章站
2022-06-05 12:39:51
...
二叉树的前中后序遍历定义
- 树(英语:Tree)是一种无向图(undirected graph),其中任意两个顶点间存在唯一一条路径。或者说,只要没有回路的连通图就是树
- 二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)
的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。 - 完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
- 平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
对于树的遍历有两大类方法:
5. 深度优先遍历:包括前、中、后序三种遍历;
6. 广度遍历:即我们平常所说的层次遍历(需要其他数据结构的支撑,比如队列)
- 前序遍历:根节点---->左子树---->右子树(对于上述图片的树,遍历结果即为:EBADCFHGI)
- 中序遍历:左子树---->根节点---->右子树(对于上述图片的树,遍历结果即为:ABCDEFGHI)
- 后续遍历:左子树---->右子树---->根节点(对于上述图片的树,遍历结果即为:ACDBGIHFE)
- 广度优先遍历:层次遍历,一层一层遍历(对于上述图片的树,遍历结果即为:EBFADHCGI)
需要注意的是,中序遍历最常用
用递归的方法创建树和遍历树
class Node(object):
"""创建一个构造树的类"""
def __init__(self, value=None, left=None, right=None):
super(Node, self).__init__()
self.value = value
self.left = left # 左子树
self.right = right # 右子树
def PreOrder(root):
'''
前序遍历
'''
if root == None:
return
print(root.value)
PreOrder(root.left)
PreOrder(root.right)
def InOrder(root):
'''
中序遍历
'''
if root == None:
return
InOrder(root.left)
print(root.value)
InOrder(root.right)
def Subsequent(root):
'''
后序遍历
'''
if root == None:
return
Subsequent(root.left)
Subsequent(root.right)
print(root.value)
def LevelTraaverse(root):
'''
广度优先遍历:层次遍历
'''
if root == None:
return
queue = [] # 新建一个队列
queue.append(root) # 将根节点入队
while len(queue): # 只要队列不为空,一直循环
lenth_q = len(queue)
for i in range(lenth_q):
r = queue.pop(0) # 根节点出队,并存放于r
if r.left is not None:
queue.append(r.left) # 左节点入队
if r.right is not None:
queue.append(r.right) # 右节点入队
print(r.value)
main函数:
if __name__=='__main__':
root=Node('E',left=Node('B',left=Node('A'),right=Node('D',left=Node('C'))), right=Node('F',right=Node('H',left=Node('G'),right=Node('I'))))
print("PreOrder traversal result:")
PreOrder(root)
print("InOrder traversal result:")
InOrder(root)
print("Subsequent traversal result:")
Subsequent(root)
print("LevelTraaverse result:")
LevelTraaverse(root)
结果:
参考:
[1]. 深入学习二叉树(一) 二叉树基础
[2]. 二叉树遍历(前序、中序、后序、层次遍历、深度优先、广度优先)