Leetcode 543. 二叉树的直径 树的遍历

地址 https://leetcode-cn.com/problems/diameter-of-binary-tree/

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 :
给定二叉树

          1
         / \
        2   3
       / \     
      4   5    
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

注意:两结点之间的路径长度是以它们之间边的数目表示。

解答
本题难度为简单。 树类型的题目考虑树的递归遍历。
直径长度很明显是以某个点为根两边的最长深度的和。
如图


我们在遍历树的每个节点的时候,并且记录当前的深度level。 并在递归回溯的时候,返回当前节点能达到的最深深度。
那么就可以得到每个节点为根的两边的最长深度,从每个节点为根的左右两边的最长深度和,就是答案。
某节点的两边最长深度和 = 该节点左子树能达到的最大深度-当前深度 + 该节点右子树能达到的最大深度-当前深度

/**
 * 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 {
public:
    int ans = 0;
    int dfs(TreeNode* root,int level){
        if(root==NULL) return level-1;
        //左右子树遍历 找到最远的节点 相加就是经过当前点的最大直径
        int l = dfs(root->left,level+1);
        int r = dfs(root->right,level+1);
        ans = max(ans,l-level+r-level);

        return max(l,r);
    }

    int diameterOfBinaryTree(TreeNode* root) {
        dfs(root,0);
        return ans;
    }
};

我的视频题解空间

posted on   itdef  阅读(43)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-04-23 剑指 Offer 41. 数据流中的中位数 && Leetcode 259

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示