题目:
从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。
给定一个二叉树的头结点root,请返回最大距离。保证点数大于等于2小于等于500.
思路:
树上的最远距离可能有两种情况:情况1——最远距离在左子树或右子树中;情况2——最远距离是左子树中到根结点最远的结点的距离加上右子树中到根结点最远的结点的距离再加上根节点(注意距离指的是结点数目)。如图所示:
由此可知,我们可以以先左后右的顺序递归地遍历一棵树,并返回:该子树中离子树根节点最远节点的距离,以及该子树中的最远距离。子树中的最远距离又可以在它的子树中的最大距离和左子树中到根结点最远的结点的距离加上右子树中到根结点最远的结点的距离再加上根节点中取最大值。
代码:
def findLongest(self, root):
# write code here
def dfs(root):
if not root:
return 0, 0
left2root, leftmax = dfs(root.left)
right2root, rightmax = dfs(root.right)
max_node2root = max(left2root, right2root)+1 # 左右子树最远节点到根节点的距离
max_dis = max(leftmax, rightmax, left2root+right2root+1) # 子树中最大距离
return max_node2root, max_dis
max_node2root, max_dis = dfs(root)
return max_dis