diff --git a/Contents/10.Dynamic-Programming/06.Tree-DP/01.Tree-DP.md b/Contents/10.Dynamic-Programming/06.Tree-DP/01.Tree-DP.md index f36bc332..c998fdea 100644 --- a/Contents/10.Dynamic-Programming/06.Tree-DP/01.Tree-DP.md +++ b/Contents/10.Dynamic-Programming/06.Tree-DP/01.Tree-DP.md @@ -78,11 +78,11 @@ 1. 最大路径和中对应路径穿过根节点。 2. 最大路径和中对应路径不穿过根节点。 -如果最大路径和中对应路径穿过根节点,则:$该二叉树的最大路径和 = 左子树中最大贡献值 + 右子树中最大贡献值 + 当前节点值$。 +如果最大路径和中对应路径穿过根节点,则:**该二叉树的最大路径和 = 左子树中最大贡献值 + 右子树中最大贡献值 + 当前节点值**。 -而如果最大路径和中对应路径不穿过根节点,则:$该二叉树的最大路径和 = 所有子树中最大路径和$。 +而如果最大路径和中对应路径不穿过根节点,则:**该二叉树的最大路径和 = 所有子树中最大路径和**。 -即:$该二叉树的最大路径和 = max(左子树中最大贡献值 + 右子树中最大贡献值 + 当前节点值, \quad 所有子树中最大路径和)$。 +即:**该二叉树的最大路径和 = max(左子树中最大贡献值 + 右子树中最大贡献值 + 当前节点值,所有子树中最大路径和)**。 对此我们可以使用深度优先搜索递归遍历二叉树,并在递归遍历的同时,维护一个最大路径和变量 $ans$。 @@ -99,7 +99,7 @@ 2. 递归计算左子树的最大贡献值为 $left\underline{}max$。 3. 递归计算右子树的最大贡献值为 $right\underline{}max$。 4. 更新维护最大路径和变量,即 $self.ans = max \lbrace self.ans, \quad left\underline{}max + right\underline{}max + node.val \rbrace$。 -5. 返回以当前节点为根节点,并且经过该节点的最大贡献值。即返回 $当前节点值 + 左右子节点提供的最大贡献值中较大的一个$。 +5. 返回以当前节点为根节点,并且经过该节点的最大贡献值。即返回 **当前节点值 + 左右子节点提供的最大贡献值中较大的一个**。 6. 最终 $self.ans$ 即为答案。 ##### 思路 1:代码 @@ -190,10 +190,10 @@ class Solution: 对于根节点为 $u$ 的树来说: -1. 如果其最长路径经过根节点 $u$,则 $最长路径长度 = 某子树中的最长路径长度 + 另一子树中的最长路径长度 + 1$。 -2. 如果其最长路径不经过根节点 $u$,则 $最长路径长度 = 某个子树中的最长路径长度$。 +1. 如果其最长路径经过根节点 $u$,则:**最长路径长度 = 某子树中的最长路径长度 + 另一子树中的最长路径长度 + 1**。 +2. 如果其最长路径不经过根节点 $u$,则:**最长路径长度 = 某个子树中的最长路径长度**。 -即:$最长路径长度 = max(某子树中的最长路径长度 + 另一子树中的最长路径长度 + 1, \quad 某个子树中的最长路径长度)$。 +即:**最长路径长度 = max(某子树中的最长路径长度 + 另一子树中的最长路径长度 + 1,某个子树中的最长路径长度)**。 对此,我们可以使用深度优先搜索递归遍历 $u$ 的所有相邻节点 $v$,并在递归遍历的同时,维护一个全局最大路径和变量 $ans$,以及当前节点 $u$ 的最大路径长度变量 $u\underline{}len$。 @@ -203,7 +203,7 @@ class Solution: 因为题目限定了「相邻节点字符不同」,所以在更新全局最长路径长度和当前节点 $u$ 的最长路径长度时,我们需要判断一下节点 $u$ 与相邻节点 $v$ 的字符是否相同,只有在字符不同的条件下,才能够更新维护。 -最后,因为题目要求的是树的直径(树的最长路径长度)中的节点个数,而:$路径的节点 = 路径长度 + 1$,所以最后我们返回 $self.ans + 1$ 作为答案。 +最后,因为题目要求的是树的直径(树的最长路径长度)中的节点个数,而:**路径的节点 = 路径长度 + 1**,所以最后我们返回 $self.ans + 1$ 作为答案。 ##### 思路 1:代码