[力扣c++实现] 543. 二叉树的直径

543. 二叉树的直径

难度简单714收藏分享切换为英文接收动态反馈

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

示例 :
给定二叉树

      1
     / \
    2   3
   / \     
  4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. 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 {
public:
    int reculenth(TreeNode *pnode,int& ret)
    {
        if (!pnode || (!pnode->left && !pnode->right))
        {
            return 0;
        }
        
        int left = max(reculenth(pnode->left,ret),0);
        int right = max(reculenth(pnode->right,ret),0);

        if (pnode->left && pnode->right)
        {
            ret = max(ret,left + right + 2);//pnode此时作为根节点和其左右子树构成直径,所有左右子树的直径加上分别连接上pnode后新增的两个单位的路径
        }
        else 
        {
            ret = max(ret,left + right + 1);//pnode此时作为根节点和其左右子树构成直径,所有左右子树的直径加上分别连接上pnode后新增的两个单位的路径
        }

        return max(left,right) + 1;//pnode以非根节点的节点身份构成直径,那么其左右子树只能取其一作为直径的一部分,那么按照题意,当然取最长的
    }

    int diameterOfBinaryTree(TreeNode* root) {
        
        int ret = -0xfffffff;
        ret = max(reculenth(root,ret),ret);
        return ret;
    }
};

你可能感兴趣的:(力扣算法题练手,leetcode,c++,算法)