1问题描述
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
在这里插入代码片
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
2题解-递归
参考了大佬的解答也遇到了一样的问题,一开始直接算两边深度,然后根节点两边相加
class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
return self.get_height(root.left) + self.get_height(root.right)
def get_height(self, root):
if not root:
return 0
return max(self.get_height(root.left), self.get_height(root.right)) + 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]
可视化看看样子
真实情况
我得需要一个值来保存我这个每次比较更新的最大直径值,用self.max = 0来初始化这个值
在每次获得一个节点的左子树和右子树的值的时候,都需要比较一下self.max和左子树高度+右子树高度的大小,把更大的保存下来
然后如何求左子树和右子树的高度呢,那就是经典的递归求高度问题:max(depth(root.left), depth(root.right))+1
class Solution:
def __init__(self):
self.max_diameter=0
def diameterOfBinaryTree(self, root: TreeNode) -> int:
self.depth(root)
return self.max_diameter
def depth(self,root:TreeNode):
if not root:
return 0
l=self.depth(root.left)
r=self.depth(root.right)
self.max_diameter=max(self.max_diameter,l+r)
return max(l,r)+1