【leetcode】leetcode543二叉树的直径:题目思路及代码

一、题目描述

传送门:leetcode 543
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树:
1
/
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

二、思路

这个题目其实是不难的,也是一个easy难度的题目,但是我平时对于树的题目都不是特别熟悉。尽管很多时候知道是用递归方法,但是还是不知道怎么设计递归的过程。
这个题目其实就是个简单的递归题目。递归函数depth每次返回当前结点的深度,但是这里的深度并不是我们通常说的,从根节点到每一个结点之间的长度,而是从下往上计算的一个深度值。这里就是我刚开始自己写的时候没有想清楚的地方,因为平时计算深度一般都是从上往下用dfs。但是其实从下往上也是一样的,只需要注意递归的出口就行,出口就是当p=NULL时,返回0,此时的深度为0.而在计算每一个结点对应的depth时,应该是max(left,right)+1,这里也是可以理解的,因为我们每次都要得到一个最大的depth,进而得到最大的直径长度。
所以这个题目其实归根结底就是一个计算depth深度的题目,只是这里的深度和我们传统意义上的深度不一样罢了。

三、通过的代码

/**
 * 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 max_ans=0;
    int diameterOfBinaryTree(TreeNode* root) {
    
    
        depth(root);
        return max_ans;
    }
    int depth(TreeNode*p)
    {
    
    
        if(p==NULL)
        return 0;
        int left=depth(p->left);//得到left结点的深度
        int right=depth(p->right);//得到right结点的深度
        max_ans=max(max_ans,left+right);//计算当前长度,并且得到最大长度
        return max(left,right)+1;//返回当前结点的深度
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38391210/article/details/108286578
今日推荐