【LeetCode】687. 最长同值路径

内代码已上传GitHub:点击我 去GitHub查看代码
写在前面: 日更5题的总结要停停了...先来篇题解混日更!

配图与题目无关...
【LeetCode】687. 最长同值路径_第1张图片

题目要求找到最长的路径, 首先要理解这个路径的概念:

  • 这个路径中的每个节点具有相同值,两个节点间的任何访问方式都是路径
  • 且路径的长度用边数表示

知道路径的概念后,让我们再次的来简化问题
【LeetCode】687. 最长同值路径_第2张图片

来看看就3个节点的树,假设我们要找它的最长同值路径,该怎么找呢?

首先能确定的就是我们需要遍历这棵树,那么先序、中序、后序遍历我们应该怎么做选择呢?这时候就要分析这个问题需要我们在什么时候对头节点进行操作。

如果我们要知道过头节点1的最长同值路径,那么直观的想法就是:拿2的值和1比较,再拿3的值和1比较。

如果它两都和1的值相等,那么以2、3为头节点分别的最长同值链长度相加即为过1节点的最长同值路径。 如果它两的值和1的值不相等,那么过1节点的最长同值路径就为0,其他情况类似

要注意,因为我们求得是过节点1的最长同值路径,所以要获取的是以2、3节点为头节点的最长链长度,这里,它们都是0。

所以根据以上的思路可以把这道题的解法写出来:

  • 通过后序遍历获得左右子树的最大链长度

  • 返回左右子树链长度大的那一个(前提是和当前树根节点值相同,否则返回0)

  • 计算过当前头节点最大同值路径并与历史最大长度比较并更新历史最大长度

以上就是这道题的主要思路以及算法解析,下面放代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

// 递归
int travel(struct TreeNode* root, int* maxresult){
    // 空节点返回0
    if(root == NULL)return 0;
    int l, r;
    // 分别计算左右子树最长同值路径
    l = travel(root -> left, maxresult);
    r = travel(root -> right, maxresult);
    // 计算当前树和左右树的衔接
    l = (root -> left != NULL && root -> left -> val == root -> val) ? l + 1 : 0;
    r = (root -> right != NULL && root -> right -> val == root -> val) ? r + 1 : 0;
    // 历史最大路径与当前树最大路劲比较并更新
    *maxresult = *maxresult > l + r ? *maxresult : l + r;
    // 返回l、r中较大值
    return l > r ? l : r;
}

int longestUnivaluePath(struct TreeNode* root){
    // 存储历史最大值
    int maxresult = 0;
    // 递归
    travel(root, &maxresult);
    return maxresult;
}

关于路径长度的题目似乎思路都十分相近,就是把找最大路径分解为在树的每个节点找起子树的最大路径,遍历一次后就能得到最终的结果。

做了这些题感觉到二叉树的递归遍历其实和分治思想的一些题没有什么太大区别,就是在对区间不断细分,最终达到便利的目的。

如果有看不懂的,私信我!!!
~^^
每天进步一点,加油!

End

END

你可能感兴趣的:(【LeetCode】687. 最长同值路径)