这道题其实也是树的长度的问题一个变种,要求出整棵树的最大路径,就是求树上两个节点之间包含边的最大数目。
好好思考一下的话,可以得出结论,应用同样的递归方式,不断往上回溯的过程中记录好两个节点之间路径的最大值,如果大于则更新,如果不大于则不变,
即这条语句: 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; }