【问题标题】:Diameter of binary tree fails 4 out of 104 test cases二叉树的直径在 104 个测试用例中有 4 个失败
【发布时间】:2021-11-28 20:31:07
【问题描述】:

我正在解决 Leet Code 问题543. Diameter of Binary Tree:

给定二叉树的root,返回树的直径的长度。

二叉树的直径是树中任意两个节点之间最长路径的长度。此路径可能会也可能不会通过root

两个节点之间路径的长度由它们之间的边数表示。

示例 1

输入: root = [1,2,3,4,5]
输出: 3
说明: 3 是路径[4,2,1,3][5,2,1,3]

这是我的尝试:

def diameterOfBinaryTree(self, root):
    return self.getHeight(root.left) + self.getHeight(root.right)

def getHeight(self, root):
    if not root:
        return 0
    return max(self.getHeight(root.left), self.getHeight(root.right)) + 1

我通过了 100/104 个测试用例。

我弄错的测试用例输入了[4,-7,-3,null,null,-9,-3,9,-7,-4,null,6,null,-6,-6,null,null,0,6,5,null,9,null,null,-1,-4,null,null,null,-2],预期结果为8。但是,由于我的解决方案的逻辑,我得到了 7 并且不知道我怎么会错。

【问题讨论】:

  • 如果您将数组表示为一棵树对我们来说会更容易
  • 您的代码假定(整个树的)根是直径的一部分。可能不是。

标签: python algorithm data-structures graph binary-tree


【解决方案1】:

我弄错的唯一测试用例输入 [4,-7,-3,null,null,-9,-3,9,-7,-4,null,6,null,-6 ,-6,null,null,0,6,5,null,9,null,null,-1,-4,null,null,null,-2] ...不知道我怎么会错。

提供的树如下所示:

                ___4___
               /       \
             -7     ___-3_____
                   /          \
              ___-9___        -3
             /        \       /
            9         -7    -4
           /          / \
        __6__       -6  -6
       /     \      /   /
      0       6    5   9
       \     /        /
       -1  -4       -2

最长的路径确实是 8,因为以 -9 为根的 子树 中最长的路径具有最长的路径。您的代码没有找到最长的路径,因为它要求根是其中的一部分。

因此,您应该检查任何子树的最长路径(递归)并保留这些选项中最长的:

  • 在左子树中找到的最长路径
  • 在右子树中找到的最长路径
  • 包含根的最长路径(即left-height + right-height + 1)

您的代码没有考虑前两个选项,总是选择第三个。

以上是在这个(隐藏的)解决方案中实现的。先自己试试吧:

class Solution(object):
def diameterOfBinaryTree(self, root):
self.longestPath = 0

def levels(node): # With side-effect: it updates longestPath
if not node:
return 0
leftLevels = levels(node.left)
@987654329 @
self.longestPath = max(self.longestPath, leftLevels + rightLevels)
return 1 + max(leftLevels, rightLevels)

levels(root) # Not interested in the returned value...
return self.longestPath # ...but all the more in the side effect!

【讨论】:

    【解决方案2】:

    您的代码假定diameter of the binary tree 将始终通过root,但事实并非如此。您必须考虑直径较长的子树。一种方法可以在下面找到,它是您的代码的略微修改版本:

    class Solution(object):
        maximum = 0
        def getHeight(self, root):
            if not root:
                return 0
            left =  self.getHeight(root.left)
            right =  self.getHeight(root.right)
            sub_diameter = left + right
            if(self.maximum < sub_diameter): self.maximum = sub_diameter
            return max(left, right) + 1
        def diameterOfBinaryTree(self, root):
            return max(self.getHeight(root.left) + self.getHeight(root.right), self.maximum)
    

    经过测试,它通过了所有测试用例。
    主要逻辑是保持子树的最大直径值,并将其与最后通过的直径进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多