二叉树是每个节点最多有两个子树的树结构。二叉树的遍历有深度优先遍历(Depth-First-Search,DFS)和广度优先遍历(Breadth-First-Search,BFS)两类。深度优先遍历包括前序遍历、中序遍历、后续遍历;广度优先遍历也就是二叉树层序遍历。访问节点的顺序如下。
前序遍历:根节点,左子节点,右子节点
中序遍历:左子节点,根节点,右子节点
后序遍历:左子节点,右子节点,根节点
层序遍历:从上到下,从左至右依次遍历节点
以下将给出这层序遍历的python实现,分别对应leetcode的以下题目。前序遍历、中序遍历、后续遍历的python实现可查找上一篇博客
二叉树节点类的定义
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
例:二叉树的结构
1
/ \
2 3
/ \ / \
14 5 6 10
层次遍历为[[1], [2, 3], [14, 5, 6, 10]]
其中关于层序遍历题目要求返回二维数组,第一维存储二叉树的每一行;另外也可以返回[1,2,3,14,5,6,10],看实际的存储要求)
(一). leetcode(102)二叉树的层序遍历
迭代法+队列实现
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root: return [] #注意特殊情况:树为空返回[]
queue = [root]
list1 = []
while queue:
list2 = []
for i in range(len(queue)):
a = queue.pop(0)#元素出队列
if a.left:
queue.append(a.left)
if a.right:
queue.append(a.right)
list2.append(a.val)
list1.append(list2)
return list1
测试
if __name__ == "__main__":
nodelist=[TreeNode(i)for i in [1,2,3,14,5,6,10]]
nodelist[0].left=nodelist[1]
nodelist[0].right=nodelist[2]
nodelist[1].left=nodelist[3]
nodelist[1].right=nodelist[4]
nodelist[2].left=nodelist[5]
nodelist[2].right=nodelist[6]
Tree=nodelist[0]
s=Solution()
m=s.levelOrder(Tree)
print("二叉树的层次遍历为%s"%(m))
#result:
二叉树的层次遍历为[[1], [2, 3], [14, 5, 6, 10]]
(二). leetcode(107)二叉树的层序遍历 II
本题要求逆序输出层序遍历的结果,因此只需和上题相似,最后返回时进行逆序即可
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
if not root: return [] #注意特殊情况:树为空返回[]
queue = [root]
list1 = []
while queue:
list2 = []
for i in range(len(queue)):
a = queue.pop(0)#元素出队列
if a.left:
queue.append(a.left)
if a.right:
queue.append(a.right)
list2.append(a.val)
list1.append(list2)
return list1[::-1]#返回时进行逆序
测试
if __name__ == "__main__":
nodelist=[TreeNode(i)for i in [1,2,3,14,5,6,10]]
nodelist[0].left=nodelist[1]
nodelist[0].right=nodelist[2]
nodelist[1].left=nodelist[3]
nodelist[1].right=nodelist[4]
nodelist[2].left=nodelist[5]
nodelist[2].right=nodelist[6]
Tree=nodelist[0]
s=Solution()
m=s.levelOrder(Tree)
print("二叉树的层次遍历逆序为%s"%(m))
#result:
二叉树的层次遍历逆序为[[14, 5, 6, 10], [2, 3], [1]]
欢迎关注公众号:算法学习总结,获取更多知识,共同交流学习