LeetCode系列2:求二叉树的直径

系列文章
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;
    }
};

在这里插入图片描述

总结

    刚接触到题目时,第一时间想到的是平衡二叉树,最理想的情况,然而现实并不理想,需要经过不停思考,不断模拟,才能将各种情况考虑清楚。在遇到这类问题时,最快的解决方法是画图,通过直观的图示,将各种情况列举出来。再统一抽象,可以快速解决问题。本题目分析过程出于本人自己的理解,如果有遗漏或者不合理的地方,请随时留言或者私信我,我会及时更正修补,尽最大努力呈现给大家一个比较完美的结果。如果您也在学习研究数据结构,请关注我,独学而无友、则孤陋而寡闻,一起进步。如果本文对您有帮助,请点赞支持我.。

发布了11 篇原创文章 · 获赞 15 · 访问量 1063

猜你喜欢

转载自blog.csdn.net/Marble_ccp/article/details/104783111