系列文章
LeetCode系列1、两数相加
题目
题目链接 →→ 二叉树的直径
分析
根据题目的描述,可以简单理解为找到左右子树的最大深度,最大深度的两个节点之间的距离即为直径。换个思路,也就是二叉树运算中,求左右子树的最大深度。如图1所示:
从上图可以看出,以根节点A为中心,可以计算出最大深度为:
D→B→A→C→F
E→B→A→C→F
即最大直径为4。以上适用于类似平衡二叉树的结构分析,以根节点为对称轴,分别求最大深度即可。
进一步分析,如果二叉树不是平衡二叉树,结果如图2所示:
从上图可以看出,根节点A已经不再是对称轴,直接以根节点求左右子树最大深度的设想已经满足不了条件,因为当前二叉树直径为:
C→A→B→E→G
C→A→B→E→F
即最大直径为4。
再思考,有没有可能是二叉树的子树中即可以得到最大直径呢?如下图所示:
很明显,根节点A的子树B是最大直径的基准点。当前二叉树直接可以表示为:
H→F→D→B→E→G
I →F→D→B→E→G
即最大直径为5,是以子树B为基准得到的最大直径。
基于上述分析,给出算法实现。
代码示例
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// 给定一个全局变量,记录当前最大直径。在各个节点处,都需要计算以当前节点为基准,求最大直径
int intMax = 0;
int diameterOfBinaryTree(TreeNode* root) {
if(root==NULL)
{
return 0;
}
getDepth(root);
return intMax;
}
int getDepth(TreeNode* node)
{
if(node==NULL)
{
return 0;
}
int left = getDepth(node->left);
int right = getDepth(node->right);
if((left+right)>intMax)
{
intMax=left+right;
}
return (left>right?left:right)+1;
}
};
总结
刚接触到题目时,第一时间想到的是平衡二叉树,最理想的情况,然而现实并不理想,需要经过不停思考,不断模拟,才能将各种情况考虑清楚。在遇到这类问题时,最快的解决方法是画图,通过直观的图示,将各种情况列举出来。再统一抽象,可以快速解决问题。本题目分析过程出于本人自己的理解,如果有遗漏或者不合理的地方,请随时留言或者私信我,我会及时更正修补,尽最大努力呈现给大家一个比较完美的结果。如果您也在学习研究数据结构,请关注我,独学而无友、则孤陋而寡闻,一起进步。如果本文对您有帮助,请点赞支持我.。