JAVA算法练习题day31
40.二叉树的直径
很有意思的一道题
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):def diameterOfBinaryTree(self, root):""":type root: Optional[TreeNode]:rtype: int"""#这样想是错误的:直径 = 左子树最大高度 + 右子树最大高度 + 1(根节点)#因为会有:某个子树内部 存在最长直径作为答案#写一个求最大高度的函数#再来:好像不能把求左右高度给割裂开,因为这样只能得到根节点下的左右子树最大高度,无法得到其他子树左右子树的最大高度。我们想要记下回溯时候的高度结果,并处理它作为更新ANS的依据。if root.left is None and root.right is None:return 0self.max_diameter = 0 # 用类变量记录最大直径(初始为0)# 递归计算高度的同时,更新最大直径def getHeight(root):if root is None:return 0#计算左右子树高度lh = getHeight(root.left)rh = getHeight(root.right)cur_diameter = lh+rhif cur_diameter > self.max_diameter:self.max_diameter = cur_diameterreturn max(lh,rh)+1getHeight(root)return self.max_diameter