鱼C论坛

 找回密码
 立即注册
查看: 602|回复: 2

[已解决]二叉树中相距最远的两个节点间的距离

[复制链接]
发表于 2023-6-16 13:00:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 好故事慢慢来 于 2023-6-16 14:18 编辑

给定一个二叉树,求二叉树中相距最远的两个节点的距离,麻烦给出以下完整代码,和思路,给个c语言的,谢谢大佬
最佳答案
2023-6-16 13:46:35
这种问题被称为求二叉树的直径,二叉树的直径被定义为树中任意两节点之间最长路径的长度。此问题可以通过深度优先搜索 (DFS) 的方法解决。

我们可以遍历每个节点,对于每个节点,我们计算左右子树的深度,然后相加。其中的最大值就是我们要找的最长路径。

以下是Python的代码实现:
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

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, node):
        if node is None:
            return 0
        # 分别计算左右子树的深度
        left_depth = self.depth(node.left)
        right_depth = self.depth(node.right)
        # 更新最大直径
        self.max_diameter = max(self.max_diameter, left_depth + right_depth)
        # 返回节点深度
        return max(left_depth, right_depth) + 1

我们定义一个全局变量  max_diameter  来保存当前最大直径,然后通过递归的方式求出每个节点的左右子树的深度,这个深度就是从当前节点到其最远的叶子节点的最长路径。因为直径可能经过根节点,所以每次计算深度时,都要更新  max_diameter 。最后,递归遍历整个树, max_diameter  就是最长路径的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-16 13:46:35 | 显示全部楼层    本楼为最佳答案   
这种问题被称为求二叉树的直径,二叉树的直径被定义为树中任意两节点之间最长路径的长度。此问题可以通过深度优先搜索 (DFS) 的方法解决。

我们可以遍历每个节点,对于每个节点,我们计算左右子树的深度,然后相加。其中的最大值就是我们要找的最长路径。

以下是Python的代码实现:
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

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, node):
        if node is None:
            return 0
        # 分别计算左右子树的深度
        left_depth = self.depth(node.left)
        right_depth = self.depth(node.right)
        # 更新最大直径
        self.max_diameter = max(self.max_diameter, left_depth + right_depth)
        # 返回节点深度
        return max(left_depth, right_depth) + 1

我们定义一个全局变量  max_diameter  来保存当前最大直径,然后通过递归的方式求出每个节点的左右子树的深度,这个深度就是从当前节点到其最远的叶子节点的最长路径。因为直径可能经过根节点,所以每次计算深度时,都要更新  max_diameter 。最后,递归遍历整个树, max_diameter  就是最长路径的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-19 15:49:54 | 显示全部楼层
isdkz 发表于 2023-6-16 13:46
这种问题被称为求二叉树的直径,二叉树的直径被定义为树中任意两节点之间最长路径的长度。此问题可以通过深 ...

能给一个c语言的代码吗,没学过py,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-27 03:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表