zoukankan      html  css  js  c++  java
  • 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 += '->' ,试一试,
    现在结果和预期一模一样了,大功告成。
  • 相关阅读:
    社会影响力入门:打造有所作为的公司
    JSP中的include有哪些?有什么差别?
    关于程序猿怎样降低程序Bug的若干建议
    linux文件打开模式
    IntelliJ IDEA 问题总结之中的一个 —— jar包、assets、maven、git
    linux下改动内核參数进行Tcp性能调优 -- 高并发
    思科模拟器配置三层交换机局域网
    MFC调试小技巧
    JAVA基础编程50题(10-12题)具体解释
    加速度传感器的原理和应用-手机翻转、失重检测、运动检测、位置识别
  • 原文地址:https://www.cnblogs.com/xyu1/p/14901692.html
Copyright © 2011-2022 走看看