<>
题目描述
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
1 / \ 2 3 / \ 4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
解题思路
我的思路
要使两个结点路径长度最长,只需要求出每个结点左边的边数 + 右边的边数,迭代出最大值即可。
简单说就是从左边最远处走向右边最远处即为路径最长。
但这样会存在一个问题,每一个结点都要求边数,会有大量的重复运算,该如何解决?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 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