力扣热题100 - 二叉树:二叉树的直径

题目描述:

题号:543

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

图片

 

解题思路:

思路一:深度优先搜索

  1. 深度优先搜索(DFS):使用DFS算法遍历二叉树。在遍历过程中,对于每个节点,都会递归地计算其左子树和右子树的最大深度。

  2. 记录每个节点的最大深度:在DFS遍历的过程中,记录从当前节点出发能够达到的最远叶子节点的距离,即当前节点的最大深度。

  3. 计算直径:二叉树的直径定义为树中任意两个节点之间最长路径的长度。在DFS遍历过程中,通过比较和更新每个节点的最大深度,可以找到整棵树中的最长路径,即二叉树的直径。

时间复杂度:O(N)

空间复杂度:O(H) H 为二叉树高度

C++

// C++
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    int max;
    //DFS
    int DFS(TreeNode* root) {
        //递归结束条件
        if(root == nullptr) {
            return 0;
        }
        //最深左子树+最深右子树为节点直径
        int deep_left = DFS(root->left) ;
        int deep_right = DFS(root->right);
        if(deep_left + deep_right + 1 > max) {
            max = deep_left + deep_right;
        }
        return std::max(deep_left, deep_right) + 1;
    }

public:
    int diameterOfBinaryTree(TreeNode* root) {
        this->max = 0;
        DFS(root);
        return max;
    }
};

go


// go
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func diameterOfBinaryTree(root *TreeNode) int {
    var depth func(*TreeNode) int
    answer := 0
    depth = func(root *TreeNode) int {
        if root == nil {
            return 0
        }
        left := depth(root.Left)
        right := depth(root.Right)
        answer = max(answer, left+right)
        return max(left, right) + 1
    }
    depth(root)
    return answer
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值