Leetcode687. 最长同值路径(C语言)
数据结构-树:算法与数据结构参考
题目:
给定一个二叉树,找到最长的路径1,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。例:
输入:[5,4,5,1,1,null,5]
输出:2
思路:
递归,注意从根开始的同值路径的处理,分不同可能情况考虑。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int result = 0; //全局变量,函数可直接调用
#define MAX(a, b) (a > b ? a : b) //为了方便,定义最大值函数
int dfs(struct TreeNode* root){ //深度优先求从根开始的最长同值路径
if (root == NULL) return 0;
int left, right;
left = dfs(root->left);
right = dfs(root->right); //递归求左右子树开始的最长同值路径
if ((root->left != NULL) && (root->left->val == root->val) && (root->right != NULL && root->right->val == root->val)) {
result = MAX(result, left + right + 2);
//两子树开始的各自最长同值路径+两子树根节点,同值路径长度靠每次累加计算
//由于各个同值路径不相连,result存储比较后最大值
return MAX(left + 1, right + 1);
} //左右值均等于根
else if (root->left != NULL && root->left->val == root->val) {
result = MAX(result, left + 1);
return left + 1;
} //只有左值等于根
else if (root->right != NULL && root->right->val == root->val) {
result = MAX(result, right + 1);
return right + 1;
} //只有右值等于根
else return 0; //均不与根同值
}
int longestUnivaluePath(struct TreeNode* root){
if (root == NULL || (root->left == NULL && root->right == NULL)) return 0;
//树为空或只有一个节点的情况
dfs(root);
return result;
}
两个节点之间的路径长度由它们之间的边数表示。 ↩︎