二叉树的直径-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的主要内容,如果未能解决你的问题,请参考以下文章