采用两个方法去解决:
1、DFS(其实就是回溯算法)
2、BFS (相当于把所以节点显示的枚举出来)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def binaryTreePaths(self, root: TreeNode) -> List[str]:
if not root:
return []
#BFS
queue = collections.deque()
#将根节点和根节点的值都放入队列中
queue.append([root,[str(root.val)]])
res = []
while queue:
#弹出节点和其结果信息
node,temp = queue.popleft()
#如果这个节点是根节点,那么就添加到结果列表中
if not node.left and not node.right:
res.append('->'.join(temp))
#如果左子树存在,那么再队列添加更新队列的信息和path的信息;右子树同理可得
if node.left:
queue.append([node.left,temp+[str(node.left.val)]])
if node.right:
queue.append([node.right,temp+[str(node.right.val)]])
return res
#DFS 其实就是回溯算法,不过回溯算法用了一个列表,需要执行一个弹出操作
#我再写的时候没有再递归的时候调用subset的信息,所以出错。
#递归底层就是一个栈,所以要试探选择所有可能性必须要同步更新消息
def DFS(root, subset):
if root:
subset += str(root.val)
#如果为叶子节点那就直接添加到结果集中去
if not root.left and not root.right:
result.append(subset)
else:
subset += '->'
DFS(root.left, subset)
DFS(root.right, subset)
result = []
DFS(root, '')
return result
总结:二叉树的问题往往都是DFS和BFS是可以相互转换的,再DFS中栈的思路一定再脑子中,这样才能把很多问题都能进行建模。