题目描述
这个题目为了更好的增强自己学习python数据结构的一些思路,所以今天将BFS(广度优先搜索)与DFS(深度优先搜索)两种解题方法都细细的去思考实现了一次,觉得还是有很大的收获。
思路
BFS(广度优先搜索)
处理流程如图:
- 使用python的
collections
模块中的deque
集合,构造出队列集合,不得不说python有这种封装确实还是很方便,关于deque的具体操作可以参考一下这个连接
- 将当前结点压入队列中,构造一个空列表用来等待存放下一层级的结点队列
- 通过while循环将deque中所有的元素进行处理,当deque为空时,即可知道所有的结点都已经被遍历
- 具体的处理中,通过
popleft()
函数取出队首的元素,若计数器locaton
的值为0,即表示该元素为这一层级最右结点,将其放入结果输出的列表中等待输出,location
+1继续遍历结点,先右后左,保证右子树优先入队出队。 - 将子树放入
node_nxt
中,更新deque队列,完成遍历循环,输出结果
DFS(深度优先搜索)
处理流程如图:
- 增加参数level用来存放当前层级
- 用
len()
函数来计算结果的长度,若层级大于结果长度即表明当前结点为该层级的第一个结点,因为我们优先遍历右结点,每一层级第一个遇到的结点即为最右结点,直接将其值增加到ans[]
的列表中去 - 通过两个自回调,优先遍历右结点,在右支完全遍历完成后回到左支进行遍历,其中level为形参,在返回时可以回到上一层级来遍历左节点,这个做法比较巧妙。最后输出结果即可。
python 代码
BFS
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
class Solution:#BFS
def __init__(self):
self.ans=[]
def rightSideView(self, root: TreeNode,) -> List[int]:
location=0
if(root==None):
return []
queue=collections.deque()
'''
collections 是 python 内建的一个集合模块,里面封装了许多集合类,其中队列相关的集合只有一个:deque。
deque 是双边队列(double-ended queue),具有队列和栈的性质,在 list 的基础上增加了移动、旋转和增删等。
'''
queue.append(root)#将root压入队列中
node_nxt=[]#下一层级放在这里等待队列调用
while len(queue)>0:
node = queue.popleft()#对最左数取出进行操作
if location == 0:#因为最右的结点最早入队,所以第一个出队的结点也就是最右结点,将其放入输出数组中
self.ans.append(node.val)
location += 1 #后续结点正常遍历
#确定下一层级的结点
if node.right is not None:
node_nxt.append(node.right)
if node.left is not None:
node_nxt.append(node.left)
queue = collections.deque(node_nxt)#更新操作队列
return self.ans
DFS
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
class Solution:#DFS
def __init__(self):
self.ans=[] #记录结果
def rightSideView(self, root: TreeNode,level=1) -> List[int]:
if(root==None):#如果不存在即返回
return []
if level > len(self.ans):#通过和结果的长度进行比较判断当前结点为该层级第一个结点
self.ans.append(root.val)
#保证右结点优先
self.rightSideView(root.right,level+1)
self.rightSideView(root.left,level+1)
return self.ans
运行效率
思考
其实广度优先和深度优先大同小异,通过将递归变成了队列而已,BFS在理解起来自我感觉相对DFS较难一点,可能主要是自己数据结构队列没学好,还需要在巩固一定的知识,可能理解起来会更加的轻松一点点。