二叉树的直径-leetocde543

Posted yanbinghao94

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的直径-leetocde543相关的知识,希望对你有一定的参考价值。

问题:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点
实例:
技术图片
树节点代码定义:

 struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
 };

思路:用递归思路求解,而且该问题和二叉树的高度有关,设mDiameter(root)为求以root为根的树最大直径,height(root)为求以root为跟的树的高度,有如下递归式:

//以root为根的树的最大直径等于,(经过root的最大直径=左子树高度+右子树高度,左子树的最大直径,右子树的最大直径) 三者中的最大值
mDiameter(root) = max(max(mDiameter(root->left), mDiameter(root->right)), height(root->left)+height(root->right))

显然,对于max(a,b),我们可以用一个公共变量存储最大值即可,那么,可以将递归的mDiameter()函数和height()函数合并:mh(root, max),有如下函数:

int mh(root, max){
    rh = mh(root->left)
    lh = mh(root->right)
    if(lh+rh > max){
        max = lh+rh;    
    }
    return (rh>lh?rh:lh) + 1;
} 

后面只需要处理子树非空,以及传指针的问题了,因为leetcode中不能定义公共变量
所以答案如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int diameterOfBinaryTree(struct TreeNode* root){
    int result = 0;
    subRoutine(root, &result);
    return result;
}

int subRoutine(struct TreeNode *root, int *maxdiameter){
    if(root == NULL)
        return 0;
    int lh, rh;
    lh = subRoutine(root -> left, maxdiameter);
    rh = subRoutine(root -> right, maxdiameter);
    if(lh + rh > *maxdiameter){
        *maxdiameter = lh + rh;
    }
    return (lh > rh ? lh : rh) + 1;
}

以上是关于二叉树的直径-leetocde543的主要内容,如果未能解决你的问题,请参考以下文章

543-二叉树的直径

543. 二叉树的直径

力扣543:二叉树的直径C++

LeetCode 543. 二叉树的直径

Leetcode 543.二叉树的直径

python刷LeetCode:543. 二叉树的直径