zoukankan      html  css  js  c++  java
  • [LeetCode] 687. 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:

    Note: The given binary tree has not more than 10000 nodes. The height of the tree is not more than 1000.

    给一个二叉树,找出最长的相同值路径,与250. Count Univalue Subtrees类似。

    解法:递归

    Java:

    class Solution {
        public int longestUnivaluePath(TreeNode root) {
            int[] res = new int[1];
            if (root != null) dfs(root, res);
            return res[0];
        }
    
        private int dfs(TreeNode node, int[] res) {
            int l = node.left != null ? dfs(node.left, res) : 0; // Longest-Univalue-Path-Start-At - left child
            int r = node.right != null ? dfs(node.right, res) : 0; // Longest-Univalue-Path-Start-At - right child
            int resl = node.left != null && node.left.val == node.val ? l + 1 : 0; // Longest-Univalue-Path-Start-At - node, and go left
            int resr = node.right != null && node.right.val == node.val ? r + 1 : 0; // Longest-Univalue-Path-Start-At - node, and go right
            res[0] = Math.max(res[0], resl + resr); // Longest-Univalue-Path-Across - node
            return Math.max(resl, resr);
        }
    }
    

    Python:

    # Time: O(n)
    # Space: O(n)
    class Solution(object):
        def longestUnivaluePath(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            longest = [0]
            def traverse(node):
                if not node:
                    return 0
                left_len, right_len = traverse(node.left), traverse(node.right)
                left = (left_len + 1) if node.left and node.left.val == node.val else 0
                right = (right_len + 1) if node.right and node.right.val == node.val else 0
                longest[0] = max(longest[0], left + right)
                return max(left, right)
            traverse(root)
            return longest[0]
    

    Python:

    # Time:  O(n)
    # Space: O(h)
    class Solution(object):
        def longestUnivaluePath(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            result = [0]
            def dfs(node):
                if not node:
                    return 0
                left, right = dfs(node.left), dfs(node.right)
                left = (left+1) if node.left and node.left.val == node.val else 0
                right = (right+1) if node.right and node.right.val == node.val else 0
                result[0] = max(result[0], left+right)
                return max(left, right)
    
            dfs(root)
            return result[0]

    C++:

    class Solution {
    public:
        int longestUnivaluePath(TreeNode* root) {
            int lup = 0;
            if (root) dfs(root, lup);
            return lup;
        }
    
    private:
        int dfs(TreeNode* node, int& lup) {
            int l = node->left ? dfs(node->left, lup) : 0;
            int r = node->right ? dfs(node->right, lup) : 0;
            int resl = node->left && node->left->val == node->val ? l + 1 : 0;
            int resr = node->right && node->right->val == node->val ? r + 1 : 0;
            lup = max(lup, resl + resr);
            return max(resl, resr);
        }
    };
    

      

    类似题目:

    [LeetCode] 250. Count Univalue Subtrees 计数相同值子树的个数  

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9795761.html
Copyright © 2011-2022 走看看