• 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 += '->' ,试一试,
    现在结果和预期一模一样了,大功告成。
  • 相关阅读:
    NYOJ127 星际之门(一)【定理】
    JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)
    如何写一个不可变类
    保护性拷贝
    猴子搬香蕉问题
    阿里云服务器安装redis启动失败问题排查
    oauth2测试
    远程连接云服务器上的mysql失败问题解决
    SQLServer中将yyyy:MM:dd HH:mm:ss.sss转为yyyyMMddHHmmss
    Centos8 安装 MySQL
  • 原文地址:https://www.cnblogs.com/xyu1/p/14901692.html
Copyright © 2020-2023  润新知