力扣543:二叉树的直径C++

Posted The Gao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣543:二叉树的直径C++相关的知识,希望对你有一定的参考价值。

题目

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

分析

这道题的难度在LeetCode上被归为简单,但我觉得这道题无论是思路上还是代码的写法上,还有具有中等难度的程度的。

这道题要求我们计算直径长度,首先我们要将求直径长度转换成一个好求的量,笔者将求直径长度转换为求二叉树的高度。这个其实是不难理解的,因为直径其实就是经过边的个数,每经过一条边,相当于高度增加1。

但是题中说明了这条路径可能穿过根结点,因此最长的路径显然是左子树的高度+右子树的高度。

分析到这里,可能有的小伙伴会想,那这个不难呀,我用递归的方法求出左子树的高度和右子树的高度,返回它们之和就是题解了。于是写出这样的代码:

class Solution {
public:
    int diameterOfBinaryTree(TreeNode* root) {
        if(!root)return 0;
        int left=GetHeight(root->left);//求左子树高度
        int right=GetHeight(root->right);//求右子树高度
        return left+right;
    }
    int GetHeight(TreeNode* root){//递归求解高度
        if(!root)return 0;
        return 1+max(GetHeight(root->left),GetHeight(root->right));
    }
};

虽然思路是正确的,但是这样由于少考虑了一种情况而导致部分用例会出现错误。
在这里插入图片描述

比如这个用例,按照上述代码的话,输出的答案是左子树高度1+右子树高度6=7。然而其最大路径实际上是以第三层-9这个父结点作为根结点时,此时左子树高度4+右子树高度=8。这就要求我们要结合后序遍历,实现从下往上求出每个父结点作为根结点时,左右子树高度和,并与下次求出的值作比较,保留较大值。

按照这个思路,就可以写代码了。

代码

class Solution {
    int maxlength=INT_MIN;//定义一个存储最大路径的变量
public:
    int diameterOfBinaryTree(TreeNode* root) {
        if(!root)return 0;
        dfs(root);//后序dfs
        return maxlength;        
    }
    int GetHeight(TreeNode* root){//求root高度的函数
        if(!root)return 0;
        return 1+max(GetHeight(root->left),GetHeight(root->right));
    }
    void dfs(TreeNode* root){
        if(!root)return;
        dfs(root->left);
        dfs(root->right);
        maxlength=max(maxlength,GetHeight(root->left)+GetHeight(root->right));//将maxlength与当前父结点左右子树高度和比较,保留较大值
    }
};

以上是关于力扣543:二叉树的直径C++的主要内容,如果未能解决你的问题,请参考以下文章

[ 力扣活动0310 ] 543. 二叉树的直径

543-二叉树的直径

二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树

[leetCode]543. 二叉树的直径

二叉树的直径-leetocde543

543. 二叉树的直径