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; //返回本函数关注的树高
}
}