NO.543 二叉树的直径 简单
思路一:深度优先遍历 这道题比较明显,立刻就能想到深度搜索,关键是怎么找到最长的。
一开始就陷入了一个误区,我觉着最大直径一定有根节点,所以根节点左子树找到最深的路径leftMax、右子树找到最深路径rightMax,最后总的最深路径就是leftMax+rightMax。很朴实的想法,但是明显是错误的。如果树是空的就错了,即使树不空但是根节点的左子树或者右子树为空也可能会出错,形如下图。
最初的这个想法浪费了不少时间,但是通过学习别人的思路发现最初的错误方法有一小部分是正确的。
虽然最大直径不一定经过根节点,但是一定经过某个节点(废话),这个某节点的左子树最深路径和右子树最深路径之和就是最大直径。
我们要找的是路径和而不是节点和,这一点要牢记。
根据这个左右子树最大深度之和的方式,深度优先遍历将所有节点的最大直径都算出来,取最大即可。递归深搜到每个叶子节点,触底返回节点左右最深的路径+1。
1 | int ans=0; |
时间复杂度:O(n)
本人菜鸟,有错误请告知,感激不尽!