zoukankan      html  css  js  c++  java
  • [LintCode 614.] 二叉树的最长连续子序列 II

    LintCode 614. 二叉树的最长连续子序列 II

    问题描述

    给定一棵二叉树,找到最长连续序列(单调且相邻节点值相差为1)路径的长度(节点数)。
    路径起点跟终点可以为二叉树的任意节点。

    样例

    例1:

    输入:
    {1,2,0,3}
    输出:
    4
    解释:

        1
       / 
      2   0
     /
    3
    0-1-2-3
    

    例2:

    输入:
    {3,2,2}
    输出:
    2
    解释:

        3
       / 
      2   2
    2-3
    

    解题思路

    这是一道递归题目,显然我们不可能枚举所有的路径,那就让每个结点来记录自己身上的最大路径长度。
    需要注意的是,对于树中的结点,自身最大单调路径长度,以及需要提供给父节点的最大单调路径长度,是不一样的。
    对于自身而言,单调路径长度,可以是两个子结点上的单调路径拼接而来,一边单调递增一边单调递减就可以了。
    对于父节点,他想知道的就只有子结点作为链条端点时候的路径长度,单增单减的都要。
    所以做法就很清晰了,函数返回值用于返回自增自减两个最大长度,全局变量用于获取全局最大值。

    参考答案

    /**
     * Definition of TreeNode:
     * class TreeNode {
     * public:
     *     int val;
     *     TreeNode *left, *right;
     *     TreeNode(int val) {
     *         this->val = val;
     *         this->left = this->right = NULL;
     *     }
     * }
     */
    
    struct Res {
        int uplen;
        int downlen;
    };
    
    class Solution {
        int longest;
    public:
        /**
         * @param root: the root of binary tree
         * @return: the length of the longest consecutive sequence path
         */
        int longestConsecutive2(TreeNode * root) {
            // write your code here
            if (root == NULL) return 0;
            longest = 0;
            longestFind(root);
            return longest;
        }
        Res longestFind(TreeNode* r) {
            if (r == NULL) return { 0, 0 };
            int up = 1, down = 1;
            if (r->left) {
                Res res = longestFind(r->left);
                if (r->val + 1 == r->left->val) down = max(down, res.downlen + 1);
                if (r->val - 1 == r->left->val) up  = max(up, res.uplen + 1);
            }
            if (r->right) {
                Res res = longestFind(r->right);
                if (r->val + 1 == r->right->val) down = max(down, res.downlen + 1);
                if (r->val - 1 == r->right->val) up = max(up, res.uplen + 1);
            }
            longest = max(longest, up + down - 1);
            return {up, down};
        }
    };
    
  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/zhcpku/p/14266141.html
Copyright © 2011-2022 走看看