题目
原题链接
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意: 两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
思路
需要注意的是,题目中有一点没讲清楚,一条路径也有可能是包括了一个节点的左右儿子的,如:示例二中的 4->4->4
那怎么解决这个问题呢?
注:以下说的“箭头”,指的是一条特殊的同值路径,该路径中的所有节点都只有一个子节点与自己同在该路径中。
定义一个函数,该函数有两个参数,一个是当前节点的指针,另一个是返回的答案。定义 l
是左子树的最长箭头的长度,r
为右子树的最长箭头的长度,lnum
存储经过当前节点并向左延伸的箭头的长度,rnum
存储经过当前节点并向右延伸的箭头的长度。接下来进行特判:
- if(当前节点与左儿子的值相等)
lnum=l+1
(注:下面代码中的“+1”在末尾体现) - if(当前节点与右儿子的值相等)
rnum=r+1
(注:下面代码中的“+1”在末尾体现) - (对于以上两个选项都有效)否则,
lnum
,runm
取值为零
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int longestUnivaluePath(TreeNode* root) {
int count = 0;
findMax(root, count);
return count;
}
int findMax(TreeNode* root, int& count) {
if(!root) return 0;
int l = findMax(root -> left, count);
int r = findMax(root -> right, count);
int lnum = 0, rnum = 0;
if(root -> left && root -> left -> val == root -> val)
lnum = l;
if(root -> right && root -> right -> val == root -> val)
rnum = r;
count = max(count, lnum + rnum);
return max(lnum, rnum) + 1;
}
};