leetcode 543 二叉树的直径

题目

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

          1
         / \
        2   3
       / \     
      4   5 

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

当我遇到了这道题目,我的第一想法就是两个字————"遍历",遍历棵树上的所有节点,遍历完成我们就可以得到答案了,其实leetcode的很多题目都是这种朴实无华的思路,千万别小看了遍历的,遍历是一切思路的基础。
在我们遍历的过程中,我们一直维护一个变量max_diameter。然后遍历完成返回这个数值即可。

好了,现在问题来了,在遍历的过程中,我们应该进行什么样的操作,来对max_diameter变量进行更新呢?

  • 我们要求的是直径,直径也就是一条路径。它只可能有一个分叉,或者没有分叉,不可能有两个分叉。
  • 当我们遍历到一个节点时候,我们得到这个节点的左右子数的高度之和,利用这个数据对max_diameter的取max进行更新。

我们遍历到的那个节点,也就是路径的分叉处,得到左右指数高度之和的意义是:根据这个节点所能能得到的最长路径

好了,这下思路就理顺了,接下来就是代码实现的环节了

class Solution {
int max_diameter;
public:
    int diameterOfBinaryTree(TreeNode* root) {
        max_diameter = 0;
        dfs(root);
        return max_diameter;
    }
    void dfs(TreeNode* root){
        if (root == nullptr)
            return;
        int left = get_height(root->left);
        int right = get_height(root->right);
        int diameter = left + right;
        max_diameter = max(max_diameter, diameter);

        dfs(root->left);
        dfs(root->right);
    }
    int get_height(TreeNode* root){
        if (root == nullptr)
            return 0;
        return max( get_height(root->left), get_height(root->right) ) + 1;
    }
};
posted @ 2020-09-05 22:27  wsl-hitsz  阅读(71)  评论(0编辑  收藏  举报