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 2022-04-23 12:13  itdef  阅读(43)  评论(0编辑  收藏  举报

导航