欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【leetCode】leetcode 543 二叉树的直径

程序员文章站 2022-05-20 10:57:44
...

https://leetcode-cn.com/problems/diameter-of-binary-tree/

【肤浅如我,通过这道题,才学会了在一个函数中修改全局变量,在另一个函数中调用那个函数,返回被修改的全局变量值。】

题目描述:

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

示例 :
给定二叉树

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

说出来你可能不信,看到树的题目,我能想到左右子树遍历,而且想到结果的产生点:每个节点求其左右子节点的高度之和,这些和的最大值就是最后的返回值。

但是我想不到如何返回值:而且对于每一个节点,需要保留两个值,一个是当前节点自己的最大高度,用于给父节点返回值用,另一个是他的左右子树的高度和,保留这个值,每次做替换保留最大值,最后返回的是这个值。但是自己的高度和这个左右子树的高度和我不知道该返回谁了,不知道是该写在主调用函数里还是辅助函数里。一看答案明白了,我的思路是对的,就是对函数结构不清楚:用全局变量保留要返回的值(这个我想到了),在辅助函数里更新这个全局变量,但是作为递归函数去返回每个节点自己的高度。 主调用函数里调用辅助函数更新全局变量,然后返回全局变量。

看代码

class Solution {
    int res;
    public int diameterOfBinaryTree(TreeNode root) {
        res=0;
        heightOfTree(root); //更新全局变量
        return res; //返回全局变量
    }
    public int heightOfTree(TreeNode node) {
        if(node==null) return 0;
        int height_left=heightOfTree(node.left);
        int height_right=heightOfTree(node.right);
        res=Math.max(res,height_left+height_right); //更新全局变量
        return Math.max(height_left,height_right)+1; //返回本函数关注的树高
    }
}