前言
LeetCode.257和LeetCode.112是两道有关遍历二叉树“路径”的题目。而他们存在相似共通之处,本文可供学习其中相通的地方。
LeetCode.257让我们找出二叉树中从根节点到每个叶节点的全部路径;
LeetCode.112让我们在二叉树的所有路径中查找是否存在“目标和”。
本文提供这两道题的解决思路和题解代码。
LeetCode.257![](https://i-blog.csdnimg.cn/blog_migrate/f3143cd3409147206c6b5d0d1aad09ad.png)
先看代码:
class Solution:
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
all_paths = []
def construct_paths(node,path):
if node:
path += str(node.val)
if node.left is None and node.right is None:
all_paths.append(path)
else:
path += '->'
construct_paths(node.left, path)
construct_paths(node.right, path)
construct_paths(root, '')
return all_paths
显然我们要不断判断每个节点是否满足条件,因此采用递归的基本思想来解决这道题。
设置递归函数construct_paths。
在递归函数中,我们要判断当前节点是否为叶节点:
如果是,则代表这条路径已经走完,那么在all_paths这个列表中增加一条完整的路径即可;
如果不是,那么我们在path这个字符串后接上"->",并且继续递归它的两个子节点。
在外层,我们使用一遍递归函数,从根节点root、空字符串""开始。
最后返回所有得到的结果,它们都存放在app_paths中。
LeetCode.112![](https://i-blog.csdnimg.cn/blog_migrate/b7b55d6acfed41b5d99accb2238c3544.png)
先看代码:
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
all_sums = []
def get_all_sums(node,node_sum):
if node:
node_sum += node.val
if node.left is None and node.right is None:
all_sums.append(node_sum)
else:
get_all_sums(node.left, node_sum)
get_all_sums(node.right, node_sum)
get_all_sums(root, 0)
if targetSum in all_sums:
return True
return False
由LeetCode.257可知,这两道题的题解代码几乎一模一样,区别仅在于判断条件后的处理过程和判断返回情况上。
在判断条件后的处理过程上,我们不再用"->"延长路径,而是改为增加node_sum的大小;
在判断返回情况上,我们也不是一股脑全部返回路径,而是判断结果列表中的所有node_sum值是否存在targetSum:如果存在,返回True;如果不存在,返回False即可。