码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的直径-leetocde543

时间:2020-03-10 16:18:59      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:amp   nod   定义   mic   code   不能   最大   null   sub   

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

 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

标签:amp   nod   定义   mic   code   不能   最大   null   sub   

原文地址:https://www.cnblogs.com/yanbinghao94/p/12455305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!