• 最长的相同节点值路径 · Longest Univalue Path


    [抄题]:

    Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root.

    Note: The length of path between two nodes is represented by the number of edges between them.

    Example 1:

    Input:

                  5
                 / 
                4   5
               /    
              1   1   5
    

    Output:

    2
    

    Example 2:

    Input:

                  1
                 / 
                4   5
               /    
              4   4   5
    

    Output:

    2

     [暴力解法]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    1. 因为可以不从root开始,以为要分情况:进行后续计算之后发现可以合并:从头开始肯定比较长,没必要讨论
    2. 以为左右两边也要分开讨论:结果求和一下就行了,还是见得太少

    [一句话思路]:

    点在线段的dfs上加一,没地方直接加,需要单独写公式

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    Example:

                    ...
                   /   
                  4 (res = resl + resr = 3)
      (resl = 2) /  (resr= 1)
        (l = 1) 4   4 (r = 0)
               /     
              4
    点数是线段数+1

    [一刷]:

    1. DFS是嵌套traverse的过程,不能当作返回值,加深理解一下
    2. DFS求的是左边或右边单独的最大值,不是合集,稍微理解下 res[0]是所有值中的最大,需要比较,理解题目

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    DFS求的是单边最大值

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    【重磅】java传递的是引用而不是数值,所以必须是数组才有用

    [关键模板化代码]:

    三元运算符把DFS特殊情况、扩展直接写了,头次见

    int resl = (root.left != null && root.val == root.left.val) ? l + 1 : 0;
    int resr = (root.right != null && root.val == root.right.val) ? r + 1 : 0;

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int longestUnivaluePath(TreeNode root) {
            //corner case
            if (root == null) {
                return 0;
            }
            int[] res = new int[1];
            //dfs
            dfs(root, res);
            //return res[0];
            return res[0];
        }
        
        public int dfs(TreeNode root, int[] res) {
            //int max = 0;
            int l = (root.left != null) ? dfs(root.left, res) : 0;
            int r = (root.right != null) ? dfs(root.right, res) : 0;
            //if root == root.left, +1
            int resl = (root.left != null && root.val == root.left.val) ? l + 1 : 0;
            int resr = (root.right != null && root.val == root.right.val) ? r + 1 : 0;
            //res[0] is sum 
            res[0] = Math.max(res[0], resl + resr);  
            //return the bigger one of l, r
            return Math.max(resl, resr);
        }
    }
    View Code
  • 相关阅读:
    DBF数据库资料
    服务器更改IP(公网)地址后,Program Neighborhood客户端无法连接服务器
    windows server 2003 无法搜索到自己的解决方法
    windows server 2008系统(sp1) 出现MMC无法创建管理单元的解决方法
    Web方式登录出现如下提示The system was not able to acquire a citrix product license...的原因
    Dell2950服务器windows server 2003安装手记
    配置终端用户的输入法
    DELPHI高精度计时方法,取毫秒级时间精度
    金蝶KIS10专业版客户端打开'91'错误:未设置对象变量或 With block 变量的解决方法
    [转载]用三张图片详解Asp.Net 全生命周期
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8583989.html
Copyright © 2020-2023  润新知