DFS-257. 二叉树的所有路径
难度简单
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
----------------------------------------------------------------------------------------------------------------------------
请看代码,和题目,可知
函数入参是一个节点类型,实际上是一个二叉树。
线索:题目说“给定一个二叉树”
返回值是列表List类型,列表的元素为字符串str类型。
因为题目较为复杂,复杂的意思是说,不能直接应用DFS算法,我们可以先得到列表中的元素,然后再将元素append到列表中。
我们新定义一个函数,比如
def newfunc(root) ->str
就是入参是一个节点类型,返回值是str类型
新函数newfunc()的作用就是对一个二叉树进行递归,直到遇到叶子节点为止。返回根节点到叶子结点的路径为str类型。
下面尝试写代码:
先定义一个newfunc()函数
进行一个DFS算法最常用到的判空: if root
因为题目示例中每个元素最前面一定是根节点的值,所以将根节点保存到一个变量中。path += str(root.val)
因为一个根节点有可能就是叶子结点,所以我们需要对root判断是不是叶子结点 if not root.left and not root.right:
如果是叶子结点,就不用继续递归了,我们需要将path变量append到全局的path_all列表中 path_all.append(path)
我们在new_func()函数定义一个全局的path_all空列表 path_all = []
如果不是叶子结点,则需要继续递归,
现在遇到一个问题,就是下面14行,调用newfunc()函数时,运行到 path += str(root.val) 这一行时,我们没有将上次得到的path变量连接起来(递归不能将各个节点连起来),怎么解决呢?
考虑给newfunc(root)函数加一个参数,变成newfunc(root, path)
为什么加参数,因为 path += str(root.val) 这一句给path赋值后,需要继续在这个path变量基础上继续加str类型的变量。
如果在14行中加一个参数path,这样就解决了。newfunc(root.left, path)
现在在第8行newfunc()函数定义处,补全参数,也加上一个参数path。 def newfunc(root, path):
如果不是叶子结点,再详细判断是左节点还是右结点,
如果左节点不为空(为空 就没有题目说的路径了,所以不为空才有调用newfunc()函数的意义),则将左节点作为newfunc()的第一个参数继续调用。newfunc(root.left, path)
如果右节点不为空,则将右节点作为newfunc()的第一个参数继续调用。newfunc(root.right, path)
现在函数newfunc()的函数体基本写完了,从newfunc()函数出来,往下写。
因为刚才我们只是定义了newfunc()函数,要使函数发挥作用,必须要调用newfunc()函数。newfunc(root, '')
我们把newfunc()的第二个参数设置为''即空字符串,因为,path最开始就应该是字符串类型而且在root的值还没加到path里面时,就应该将第二个参数设置为空字符串。
最后写一个return语句,return path_all。
下面我们将下面代码运行一遍:
1 class Solution(object): 2 def binaryTreePaths(self, root): 3 """ 4 :type root: TreeNode 5 :rtype: List[str] 6 """ 7 path_all = [] 8 def newfunc(root, path): 9 if root: 10 path += str(root.val) 11 if not root.left and not root.right: 12 path_all.append(path) 13 else: 14 if root.left: 15 newfunc(root.left, path) 16 if root.right: 17 newfunc(root.right, path) 18 newfunc(root, '') 19 return path_all
运行结果是:
可以看到,输出结果和预期值只差一个箭头了,
我们继续改代码:
因为上图中在第一个root节点有箭头,即1后面有箭头,
必然在第上图中16行以后,因为箭头是用来连接不同的节点的,所以必然是19行 else语句之后,
我们在else语句后面加上 path += '->' ,试一试,
现在结果和预期一模一样了,大功告成。