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. 两个节点之间的路径长度由它们之间的边数表示。 ↩︎

发布了42 篇原创文章 · 获赞 0 · 访问量 596

猜你喜欢

转载自blog.csdn.net/jeanlu/article/details/104296521