【问题标题】:Null check in pythonpython中的空检查
【发布时间】:2020-03-17 21:12:01
【问题描述】:

我是学习 Python 的新手,正在编写一个函数,该函数返回一个二叉树中节点的孙子(如果它们存在)的总和,并且只设法想出了这段草率的代码。

如果有人对以更 Python 的方式改进我当前函数的简洁性有任何提示,将不胜感激。

    def value_of_grandchildren(self, root):
        sum = 0
        if root.left and root.left.left:
            sum += root.left.left.val
        if root.left and root.left.right:
            sum += root.left.right.val
        if root.right and root.right.left:
            sum += root.right.left.val
        if root.right and root.right.right:
            sum += root.right.right.val
        return sum

【问题讨论】:

  • 使其成为递归函数
  • 您真的只是想要孙辈的总和,还是想要所有后代的总和并且目前只有孙辈的深度?
  • 在 Stack Overflow 和在线其他地方有很多例子展示了如何递归地访问树,对于给定数量的级别等。请在此处发布之前将其中一个或多个添加到您的代码中 - - 正如指南中所说。如果您仍有问题,请提供minimal, reproducible example

标签: python python-3.x coding-style


【解决方案1】:

使用内部函数使其更具可读性。

def value_of_grandchildren(self, root):
    sum = 0
    def add(node):
        if not node:
            return
        if node.left:
            sum += node.left.val
        if node.right:
            sum += node.right.val
    add(root.left)
    add(root.right)
    return sum

【讨论】:

    【解决方案2】:

    您可以跳过两次检查root.leftroot.right 是否存在

        def value_of_grandchildren(self, root):
            sum = 0
            if root.left:
                if root.left.left:
                    sum += root.left.left.val
                if root.left.right:
                    sum += root.left.right.val
            if root.right:
                if root.right.left:
                    sum += root.right.left
                if root.right.right:
                    sum += root.right.right.val
            return sum
    

    对于更 Pythonic 的方式,您可以将函数泛化为对根的所有 n 代后代求和。

        def value_of_descendants(self, root, n):
            sums = 0
            if n == 0 and root:
                return root.val
            if root:
                sums += value_of_descendants(self, root.left, n-1)
                sums += value_of_descendants(self, root.right, n-1)
            return sums
    

    请注意,我没有对此进行测试,但您应该大致了解。

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2021-08-16
      • 2018-03-03
      • 2020-03-07
      • 1970-01-01
      相关资源
      最近更新 更多