zoukankan      html  css  js  c++  java
  • #leetcode687.最长同值路径

     

     最长同值路径,就是相同值组成的节点路径中最长的路径的边的个数,不要求一定是从根节点到叶子节点。

    所以,先看下题解的代码:

    int maxPath = 0;
        //给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
        public int longestUnivaluePath(TreeNode root) {
            dfs(root);
            return maxPath;
        }
    
        public int dfs(TreeNode root) {
    
            if(root == null)
                return 0;
    
            int left = dfs(root.left);
            int right = dfs(root.right);
    
            int leftPath = root.left !=null && root.left.val == root.val ? left + 1 : 0;
            int rightPath = root.right != null && root.right.val == root.val ? right + 1 : 0;
    
            maxPath = Math.max(maxPath, leftPath + rightPath);
    
            return Math.max(leftPath, rightPath);
        }

    设置一个全局变量maxPath;然后是调用dfs递归函数。dfs是深度优先遍历;

    如果root == null的情况下直接返回0;

    然后是深度优先遍历 int left = dfs(root.left) + int right = dfs(root.right);

    left和right返回的结果后续再分析

    接下来是本题目的重点,就是 如果左节点的val和当前root节点的val相等,那么leftPath就可以在当前的left返回值上+1,而如果不相等则直接清零;

    同理,如果右节点的val和root的val相等的话,rightPath的值可以在当前的right的返回值上+1,而如果不相等,的话同样也需要清零;

    最后是返回值问题,因为它决定了left和right值的具体意义,这边是Math.max(leftPath, rightPath)

    就是说当前函数作用域内的主节点的最大可能的路径的数目;这样逐渐积累,当回溯到根节点的时候,就能得到同值的最大路径的长度了;

  • 相关阅读:
    ORA-06530: 引用未初始化的组合 ;
    oracle 简单的sysTimeStamp类型转date 类型
    Luogu P3388 【模板】割点(割顶)
    Luogu P2048 [NOI2010]超级钢琴
    Luogu P2657 [SCOI2009]windy数
    QZEZ第一届“饭吉圆”杯程序设计竞赛
    Luogu P2286 [HNOI2004]宠物收养场
    在平衡树的海洋中畅游(一)——Treap
    Luogu P1129 [ZJOI2007]矩阵游戏
    LOJ #559. 「LibreOJ Round #9」ZQC 的迷宫
  • 原文地址:https://www.cnblogs.com/kerwins-AC/p/14460574.html
Copyright © 2011-2022 走看看