Keshawn_lu's Blog

Leetcode 687. 最长同值路径

字数统计: 495阅读时长: 2 min
2022/09/02 Share

题目简介:

给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。

两个节点之间的路径长度 由它们之间的边数表示。

示例 1:

ex1

1
2
输入:root = [5,4,5,1,1,5]
输出:2

示例 2:

ex2

1
2
输入:root = [1,4,5,4,4,5]
输出:2

提示:

  • 树的节点数的范围是 [0, 10^4]
  • -1000 <= Node.val <= 1000
  • 树的深度将不超过 1000

思路:

利用深度优先搜索,最长同值路径长度必定为某一节点的左最长同值路径长度与右最长同值路径长度之和

我们先分别获取当前结点的左最长同值有向路径长度与右最长同值路径长度left, right。若当前结点与左结点值相同。则res_left = left + 1,否则res_left = 0;右节点也是如此。

所以最后当前结点的最长同值路径长度为res_left + res_right

返回上一层时,返回的最长同值路径长度则为max(res_left, res_right)。(一条路到了岔路口,只能选一个方向,所以取左右两边最长的一边)

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:

int res = 0;
int dfs(TreeNode* root){

if(!root)
return 0;

int left = dfs(root -> left); //左最长同值路径长度
int right = dfs(root -> right); //右最长同值路径长度

int res_left = 0;
if(root -> left && root -> left -> val == root -> val)
res_left = 1 + left;

int res_right = 0;
if(root -> right && root -> right -> val == root -> val)
res_right = 1 + right;

res = max(res, res_left + res_right); //更新全局遍历,最长路径

return max(res_left, res_right); //返回上一层
}

int longestUnivaluePath(TreeNode* root) {

int temp = dfs(root);

return res;

}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: