一起学习LeetCode热题100道(40/100)

40.二叉树的直径(学习)

给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。

示例 1:
在这里插入图片描述
输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:
输入:root = [1,2]
输出:1

提示:
树中节点数目在范围 [1, 104] 内
-100 <= Node.val <= 100

解析:
1.定义全局变量: 我们需要一个全局变量(或闭包中的变量)来跟踪到目前为止找到的最长路径的长度,即直径。
2.编写DFS函数: 这个函数将递归地遍历二叉树,并返回以当前节点为根的子树的最大深度。同时,在遍历过程中,它会检查并更新全局直径变量。
3.计算深度: 对于每个节点,我们递归地计算其左子树和右子树的最大深度。然后,我们可以通过左子树深度加右子树深度(再减去1,因为路径不应重复计算当前节点)来得到经过当前节点的最长路径长度。我们将这个长度与全局直径进行比较,并更新全局直径(如果需要)。
4.返回深度: 最后,我们返回以当前节点为根的子树的最大深度(即左子树和右子树深度的较大值加1)。
5.启动DFS: 从根节点开始调用DFS函数。
6.返回结果: DFS完成后,全局直径变量将包含二叉树的直径,我们将其返回。

var diameterOfBinaryTree = function(root) {
    let diameter = 0;  
  
    // 辅助函数,返回以当前节点为根的子树的最大深度,并更新全局直径  
    function dfs(node) {  
        if (!node) return 0;  
  
        // 分别计算左子树和右子树的最大深度  
        const leftDepth = dfs(node.left);  
        const rightDepth = dfs(node.right);  
  
        // 更新直径  
        diameter = Math.max(diameter, leftDepth + rightDepth);  
  
        // 返回以当前节点为根的子树的最大深度  
        return Math.max(leftDepth, rightDepth) + 1;  
    }  
  
    dfs(root);  
    return diameter;  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值