zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    Jenkins自定义变量共享
    HTML中调用JavaScript的几种情况和规范写法
    [Python] 建 Django 项目
    [Django] Window上通过IIS发布Django网站
    [Python] 怎么把HTML的报告转换为图片,利用无头浏览器
    VMware vSphere Client
    mysql优化
    LINUX 内核的优化
    sed强大的固定替换格式
    nfs以及优化
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/13620074.html
Copyright © 2011-2022 走看看