zoukankan      html  css  js  c++  java
  • [ 力扣活动0310 ] 543. 二叉树的直径

    <>

    题目描述


     给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。

    示例 :
    给定二叉树

              1
             / 
            2   3
           /      
          4   5    
    

    返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

    注意:两结点之间的路径长度是以它们之间边的数目表示。

    解题思路 


    我的思路

    要使两个结点路径长度最长,只需要求出每个结点左边的边数 + 右边的边数,迭代出最大值即可。

    简单说就是从左边最远处走向右边最远处即为路径最长。

    但这样会存在一个问题,每一个结点都要求边数,会有大量的重复运算,该如何解决?

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def diameterOfBinaryTree(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            def layers(node):
                if not node:
                    return 0
                return 1+max(layers(node.left),layers(node.right))
            if not root:
                return 0
    
    
            # return layers(root.right)
            stack = [root]
            ret = -1
            while len(stack):
                node = stack.pop()
                left , right = 0,0
                if node.left:
                    left = layers(node.left)
                    stack.append(node.left)
                if node.right:
                    right = layers(node.right)
                    stack.append(node.right)
                if left+right > ret:
                    ret = left+right
            return ret
    View Code

    总结


  • 相关阅读:
    HDU 5438 Ponds
    [HNOI2013]比赛
    [HNOI2009]最小圈
    【模板】高斯消元法
    控制公司 Controlling Companies
    sdut 2878 圆圈
    滑雪
    [ZJOI2010]排列计数
    [HNOI2003]激光炸弹
    [BZOJ 3732]Network
  • 原文地址:https://www.cnblogs.com/remly/p/12465267.html
Copyright © 2011-2022 走看看