二叉树-7.13 树上最远距离

题目:

从二叉树的节点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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值