|
48 | 48 |
|
49 | 49 | 根据路径是否穿过根节点,我们可以将二叉树分为两种:
|
50 | 50 |
|
51 | | -1. 直径长度所对应的路径穿过根节点,这种情况下:$二叉树的直径 = 左子树高度 + 右子树高度$。 |
52 | | -2. 直径长度所对应的路径不穿过根节点,这种情况下:$二叉树的直径 = 所有子树中最大直径长度$。 |
| 51 | +1. 直径长度所对应的路径穿过根节点,这种情况下:$\text{二叉树的直径} = \text{左子树高度} + \text{右子树高度}$。 |
| 52 | +2. 直径长度所对应的路径不穿过根节点,这种情况下:$\text{二叉树的直径} = \text{所有子树中最大直径长度}$。 |
53 | 53 |
|
54 | | -也就是说根为 $root$ 的二叉树的直径长度可能来自于 $左子树高度 + 右子树高度,ドル也可能来自于 $子树中的最大直径,ドル即 $二叉树的直径 = max(左子树高度 + 右子树高度, \quad 所有子树中最大直径长度)$。 |
| 54 | +也就是说根为 $root$ 的二叉树的直径长度可能来自于 $\text{左子树高度} + \text{右子树高度},ドル也可能来自于 $\text{子树中的最大直径},ドル即 $\text{二叉树的直径} = max(\text{左子树高度} + \text{右子树高度}, \quad \text{所有子树中最大直径长度})$。 |
55 | 55 |
|
56 | 56 | 那么现在问题就变成为如何求「子树的高度」和「子树中的最大直径」。
|
57 | 57 |
|
58 | 58 | 1. 子树的高度:我们可以利用深度优先搜索方法,递归遍历左右子树,并分别返回左右子树的高度。
|
59 | | -2. 子树中的最大直径:我们可以在递归求解子树高度的时候维护一个 $ans$ 变量,用于记录所有 $左子树高度 + 右子树高度$ 中的最大值。 |
| 59 | +2. 子树中的最大直径:我们可以在递归求解子树高度的时候维护一个 $ans$ 变量,用于记录所有 $\text{左子树高度} + \text{右子树高度$ 中的最大值。 |
60 | 60 |
|
61 | 61 | 最终 $ans$ 就是我们所求的该二叉树的最大直径。
|
62 | 62 |
|
63 | 63 | 接下来我们再来加上「路径中每个节点具有相同值」这个限制条件。
|
64 | 64 |
|
65 | 65 | 1. 「左子树高度」应变为「左子树最长同值路径长度」。
|
66 | 66 | 2. 「右子树高度」应变为「右子树最长同值路径长度」。
|
67 | | -3. 题目变为求「二叉树的最长同值路径长度」,式子为:$二叉树的最长同值路径长度 = max(左子树最长同值路径长度 + 右子树最长同值路径长度, \quad 所有子树中最长同值路径长度)$。 |
| 67 | +3. 题目变为求「二叉树的最长同值路径长度」,式子为:$\text{二叉树的最长同值路径长度} = max(\text{左子树最长同值路径长度} + \text{右子树最长同值路径长度}, \quad \text{所有子树中最长同值路径长度})$。 |
68 | 68 |
|
69 | 69 | 在递归遍历的时候,我们还需要当前节点与左右子节点的值的相同情况,来维护更新「包含当前节点的最长同值路径长度」。
|
70 | 70 |
|
71 | | -1. 在递归遍历左子树时,如果当前节点与左子树的值相同,则:$包含当前节点向左的最长同值路径长度 = 左子树最长同值路径长度 + 1,ドル否则为 0ドル$。 |
72 | | -2. 在递归遍历左子树时,如果当前节点与左子树的值相同,则:$包含当前节点向右的最长同值路径长度 = 右子树最长同值路径长度 + 1,ドル否则为 0ドル$。 |
| 71 | +1. 在递归遍历左子树时,如果当前节点与左子树的值相同,则:$\text{包含当前节点向左的最长同值路径长度} = \text{左子树最长同值路径长度} + 1,ドル否则为 0ドル$。 |
| 72 | +2. 在递归遍历左子树时,如果当前节点与左子树的值相同,则:$\text{包含当前节点向右的最长同值路径长度} = \text{右子树最长同值路径长度} + 1,ドル否则为 0ドル$。 |
73 | 73 |
|
74 | | -则:$包含当前节点向左的最长同值路径长度 = max(包含当前节点向左的最长同值路径长度, \quad 包含当前节点向右的最长同值路径长度)$。 |
| 74 | +则:$\text{包含当前节点向左的最长同值路径长度} = max(\text{包含当前节点向左的最长同值路径长度}, \quad \text{包含当前节点向右的最长同值路径长度})$。 |
75 | 75 |
|
76 | 76 | ### 思路 1:代码
|
77 | 77 |
|
|
0 commit comments