链接:https://leetcode-cn.com/problems/longest-univalue-path
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/* 思路
* 二叉树的每个节点为根节点展开遍历,判断最大值
* 提高: 保存每次遍历的值
*/
int search_tree_root(struct TreeNode* root){
if(NULL == root){return 0;}
static int root_flag = 0;
int tmp_flag = root_flag; // tmp_flag == 0 时回到根节点
int left = 0;
int right = 0;
if(NULL != root->left && root->val == root->left->val){
root_flag++;
left = search_tree_root(root->left) + 1;
}
if(NULL != root->right && root->val == root->right->val){
root_flag++;
right = search_tree_root(root->right) + 1;
}
// 只有进入的根节点可以左右子树相加求最长路径,子树需要判断左右子树最长路径,取最长
if(0 == tmp_flag){
root_flag = 0; // 提交测试时,max被多个例子修改了,所以这个地方需要让root_flag置0
return left + right;
}
return left > right ? left : right;
}
int longestUnivaluePath(struct TreeNode* root){
if(NULL == root){return 0;}
static int max = 0;
int ret = search_tree_root(root);
if(max < ret){ max = ret;}
int left;
int right;
left = longestUnivaluePath(root->left);
right = longestUnivaluePath(root->right);
if(max < left){ max = left;}
if(max < right){ max = right;}
// 提交测试时,max被多个例子修改了,所以这个地方需要让max置0
int tmp = max;
max = 0;
return tmp;
}