每日一道算法题--leetcode 543--二叉树的直径--C++

【题目描述】

【代码思路】

这道题与我的上一篇非常相似,leetcode 687--最长同值路径可以对比着来看。由题目可见,在求最长路径时也是不能回溯的。抓住一个点理清递归函数内部逻辑,拿题目中2这个结点来看,需要把左右子树的最长路径分别求出来,分别为left,right,只要2结点的左子树不为空那么left+1,右子树不为空right+1。用一个全局变量cmax把当前最长路径保存起来,cmax=max(left+right,cmax),由于不能回溯计算路径长度,递归函数返回的只能是左右子树中最长路径的较大值,return max(left,right)。如果递归函数dfs(root==null),那肯定是return 0了,无需继续进行下面的语句。

【源代码】

/**
 * 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 cmax=0;
    int diameterOfBinaryTree(TreeNode* root) {
        dfs(root);
        return cmax;  
    }
    int dfs(TreeNode* root){
        if(root==NULL){
            return 0;
        }
        int left=dfs(root->left);
        int right=dfs(root->right);
        if(root->left!=NULL){
            left++;
        }
        if(root->right!=NULL){
            right++;
        }
        cmax=max(right+left,cmax); 
        return max(left,right);
    }
};

猜你喜欢

转载自blog.csdn.net/transformed/article/details/88725906