zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    C# Linq Enumerable 技巧
    Winform 踩坑
    BootStrap Table
    java8+junit5实现并发测试(多线程)
    Junit5+REST-assured 做接口测试
    log4j的使用
    ASP.NET项目启用SSL
    hyper-v虚拟机内存占用过高
    C#使用qq邮箱的smtp服务发邮件
    CALayer设置圆角
  • 原文地址:https://www.cnblogs.com/doubest/p/12832557.html
Copyright © 2011-2022 走看看