Leetcode687. 最长同值路径(C语言)

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;
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值