Loading

687. 最长同值路径(Leetcode)(递归+树)

687. 最长同值路径

题目链接:

https://leetcode-cn.com/problems/longest-univalue-path/

题解:

这个题真的绝了,先谈思路:

1)找到node结点的左右子树的最长单向延升的路径长度

2)在找最长单向延生的路径的过程中,记录以当前结点为根的最长同值路径(这个是附属品,切不可返回改值,返回改值,会导致返回连通路径的长度,而不是一条不用拐弯的路径)

坑点:

必须先找左右子树的最长单向延升的路径长度,虽然这个左右子树的最长单向延升的路径长度只会在if里的时候用,但是必须在if外面就求出来,如果这样做,当if语句条件不满足时,就没法循环遍历所有结点了。

AC代码:

class Solution {
    int ans = 0;
    public int longestUnivaluePath(TreeNode root) {
        arrowLength(root);
        return ans;
    }
    public int arrowLength(TreeNode root) {
        if(root == null) return 0;
        if(root.left == null && root.right == null) return 0;
        // 必须把leftAns和rightAns写在外面,虽然只会在if语句里用,但是为了构建结果ans,必须写外面,如果不写外面,左右子树的ans可能没构建
        int leftAns = arrowLength(root.left);
        int rightAns = arrowLength(root.right);
        int ans1 = 0, ans2 = 0;
        // 以下为一开始的错误示范
        // if(root.left != null && root.left.val == root.val) ans1 = 1 + arrowLength(root.left);
        // if(root.right != null && root.right.val == root.val) ans2 = 1 + arrowLength(root.right);
        if(root.left != null && root.left.val == root.val) ans1 = 1 + leftAns;
        if(root.right != null && root.right.val == root.val) ans2 = 1 + rightAns;
        ans = Math.max(ans,ans1 + ans2);
        return Math.max(ans1,ans2);
    }
}
posted @ 2020-05-05 20:29  Doubest  阅读(174)  评论(0编辑  收藏  举报