#leetcode543.二叉树的直径

这道题其实也是树的长度的问题一个变种,要求出整棵树的最大路径,就是求树上两个节点之间包含边的最大数目。

好好思考一下的话,可以得出结论,应用同样的递归方式,不断往上回溯的过程中记录好两个节点之间路径的最大值,如果大于则更新,如果不大于则不变,

即这条语句: max = Math.max(max, left+right);

这样在返回到根节点的时候就可以完成最大长度的计算了;

这里可能会有的一个疑问是:

求边的长度,按理说应该说点的长度-1才对,为什么返回的时候直接返回了left+right呢,怎么不减1呢 

hhh 如果你跟我有相同的疑问的话,那么恭喜你赚大了,其实是因为,left + right 是左右子树的长度,你如果真的要求出所有节点的数目的话,应该是 left + right + 1!!!因为还有个父节点哈

所以+1个父节点构成通路再减去一个点到边的转化,那么刚好就是不加不减了!所以结论就是了。

贴一下代码吧~:

private int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        maxDepth(root);
        return max;
    }

    public int maxDepth(TreeNode root) {

        if (root == null)
            return 0;

        int left = maxDepth( root.left );
        int right = maxDepth( root.right );

        max = Math.max( max, left + right);

        return Math.max(left, right) + 1;

    }
原文地址:https://www.cnblogs.com/kerwins-AC/p/14448883.html