二叉树遍历知多少
一直以来,二叉树相关算法问题是研发面试经常被问到的,所以对于程序员来说,尤其是做后端开发的程序员来说必须要掌握的。之前我对于二叉树的应用和算法都比较模糊,直到有次面试被问到如果一层一层去遍历一个二叉树,当时被问的有点懵,回来后恶补了一下二叉树
广度优先
广度优先搜索(Breadth First Search),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,上面二叉树的遍历顺序为:ABCDEFG.
可以利用队列实现广度优先搜索。
我们先看下面的一道题,层次遍历
何为层次遍历
说白了,就是一层一层、由上至下、由左至右的搜索遍历二叉树中的元素。
按照上图,输出的顺序是 1,2,3,4,5,6,7,8,9,10
解这道题的思路就是用到了广度(宽度)优先的算法
利用队列,依次将根,左子树,右子树存入队列,按照队列的先进先出规则来实现层次遍历。
直接上代码:
def BFS(self,root): #层次遍历核心代码
if root == None:
return
queue = []
queue.append(root)
while queue:
node = queue.pop(0)
print(node.data)
if node.left != None:
queue.append(node.left)
if node.right != None:
queue.append(node.right)
利用list 做了一个队列,进行缓存,按照 根节点,左子树,右子树的方式进行存储,弹出,打印
深度优先
上面整体说了一下广度优先的遍历,那么与其相对应的还有深度优先的遍历方式,也是经常被用到
深度优先,简单讲是搜索包括从一条路径的起始点开始追溯,直到到达最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,如此往复,直到没有路径为止
还是来看这张图
按照深度优先的输出顺序
A,B,D,E,C,F,G
深度优先遍历即是先按深度来遍历二叉树,包括:
前序遍历
遍历顺序 --> 根节点 -> 左子树 -> 右子树
中序遍历
遍历顺序--> 左子树 -> 根节点 -> 右子树
后序遍历
遍历顺序--> 左子树 -> 右子树 -> 根节点
每种顺序的遍历有轻微的差别
首先,定义 TreeNode:
class TreeNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left # 左子树
self.right = right # 右子树
实例化一个 TreeNode:
treeNode = TreeNode("A",
TreeNode("B",
TreeNode("D"),
TreeNode("E")
),
TreeNode("C",
TreeNode("F"),
TreeNode("G")
)
)
前序遍历
def preTraverse(root):
if root is None:
return
print(root.value)
preTraverse(root.left)
preTraverse(root.right)
输出顺序:
A,B,D,E,C,F,G
中序遍历
def midTraverse(root):
if root is None:
return
midTraverse(root.left)
print(root.value)
midTraverse(root.right)
输出顺序:
D,B,E,A,F,C,G
后序遍历
def afterTraverse(root): if root is None: return afterTraverse(root.left) afterTraverse(root.right) print(root.value)
输出顺序:
D,E,B,F,G,C,A
以上就是二叉树的广度优先遍历和深度优先遍历,在日常开发中,会经常遇到类似的场景应用,熟练掌握二叉树的相关算法也会对开发出高性能的程序提供很多帮助,
这期就介绍到这,下期见
福利:
关注公众号,回复python3 即可获得python3 全套教程
多多分享,福利多多
关注哦
👇