广度优先遍历BFS思想在二叉树中的应用总结(python详解)

广度优先遍历(Breadth First Search)思想在二叉树中可用来解决多种问题,常见问题以及python代码详解
首先回顾一下树的广度优先遍历,即树的层次遍历

主要思想:使用队结构,先访问根节点,再将对应的左子树、右子树分别入队

def bfs(root):
	tree_list=[]
	queue=[root]
	while queue:
		node=queue.pop(0)
		if node:
			tree_list.append(node.val)
			queue.append(node.left)
			queue.append(node.right)
	return tree_list
1.二叉树的深度

树的深度:从根节点到叶子节点路径中的节点个数

1)二叉树最大深度

主要思想:层序遍历,每遍历一层,深度加一(用队存储每一层的节点)
力扣网址:力扣中对应题目网址

def max_depth(root):
	if not root:
		return 0
	if not root.left and not root.right:
		return 1
	depth=0
	queue=[root]
	while queue:
		tmp=[]
		for node in queue:
			if node.left:tmp.append(node.left)
			if node.right:tmp.append(node.right)	
		depth+=1
		queue=tmp
	return depth
		
2)二叉树最小深度

主要思想:使用队层序遍历将对应的节点和深度入队,找到队中第一个没有左右子树的节点,即二叉树最小深度(不需要访问所有的节点)
力扣中对应题目网址

def min_depth(root):
	if not root:
		return 0
	queue=[(root,1)]
	while queue:
		node,depth=queue.pop(0)
		if not node.left and not node.right:
			return depth
		if node.left:queue.append((node.left,depth+1))
		if node.right:queue.append((node.right,depth+1))
	return depth		
2.二叉树的最大宽度

主要思路:层序遍历,每次将节点和对应下标索引入队,树的宽度=每层的最右边节点索引-最左边节点索引+1
力扣中对应题目网址

def max_width(root):
	if not root:
		return 0
	queue=[(root,0)]
	max_width=1
	while queue:
		max_width=max(max_width,queue[-1][1]-queue[0][1]+1)
		tmp=[]
		for node,i in queue:
			if node.left:tmp.append((node.left,2*i+1))
			if node.right:tmp.append((node.right,2*i+2))
		queue=tmp
	return max_width
3.翻转二叉树

主要思路:层序遍历思想,节点入队,交换对应节点的左右子树,再将左右子树(存在)分别入队
力扣中对应题目网址

def invert_tree(root):
	if not root:
		return root
	queue=[root]
	while queue:
		node=queue.pop(0)
		node.left,node.right=node.right,node.left
		if node.left:
			queue.append(node.left)
		if node.right:
			queue.append(node.right)
	return root
4.对称二叉树:给定二叉树判断是否镜像对称

主要思路:层序遍历,用队存储每一层的节点,判断每一层正反输出是否一样
力扣中对应题目网址

def symmetric_tree(root):
	if not root:
		return True
	queue=[root]
	while queue:
		level_node=[]
		level_list=[]
		for node in queue:
			if node:
				level_list.append(node.val)
				level_node.append(node.left)
				level_node.append(node.right)
			else:
				level_list.append("null")
		if level_list!=level_list[::-1]:
			return False
		queue=level_node
	return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值