23 二叉树中的最长连续序列(Binary Tree Longest Consecutive Sequence)

1 题目

题目:二叉树中的最长连续序列(Binary Tree Longest Consecutive Sequence)
描述:给一棵二叉树,找到最长连续路径的长度。这条路径是指 任何的节点序列中的起始节点到树中的任一节点都必须遵循 父-子 联系。最长的连续路径必须是从父亲节点到孩子节点(不能逆序)。

lintcode题号——595,难度——easy

样例1:

输入:{1,#,3,2,4,#,#,#,5}
输出:3
解释:
这棵树如图所示
   1
    \
     3
    / \
   2   4
        \
         5
最长连续序列是3-4-5,所以返回3.

样例2:

输入:{2,#,3,2,#,1,#}
输出:2
解释:
这棵树如图所示:
   2
    \
     3
    / 
   2    
  / 
 1
最长连续序列是2-3,而不是3-2-1,所以返回2.

2 解决方案

2.1 思路

  使用分治法,递归定义成计算当前节点的最常连续序列长度,获得左右子树的结果后进行对比记录最大值即可。

2.2 时间复杂度

  需要完整遍历整棵树,算法的时间复杂度为O(n)。

2.3 空间复杂度

  算法的空间复杂度为O(1)。

3 源码

细节:

  1. 不能直接用longestConsecutive递归(无法返回m_lengthLongest,只能返回以根节点开始的最长序列长度)。
  2. 当前结点对比左右子树的返回值时,需要打擂台确定最大值,还要考虑叶子结点的情况。
  3. 如果左右都不能连续,则长度需要归1,即不走if语句,则为1,走了if语句打擂台出最大值。

C++版本:

/**
* Definition of TreeNode:
* class TreeNode {
* public:
*     int val;
*     TreeNode *left, *right;
*     TreeNode(int val) {
*         this->val = val;
*         this->left = this->right = NULL;
*     }
* }
*/
/**
* @param root: the root of binary tree
* @return: the length of the longest consecutive sequence path
*/
int m_longestValue;
int longestConsecutive(TreeNode *root) {
    // write your code here
    m_longestValue = 0;
    calLongestValue(root);
    return m_longestValue;
}

// 返回当前节点开始的最长序列长度
int calLongestValue(TreeNode *root)
{
    if (root == nullptr)
    {
        return 0;
    }

    int result = 1;
    int leftResult = calLongestValue(root->left);
    int rightResult = calLongestValue(root->right);

    // 打擂台决出result、leftResult、rightResult中的最大值,叶子节点跳过该步骤直接返回1
    if (root->left != nullptr && root->val + 1 == root->left->val)
    {
        result = max(result, leftResult + 1);
    }
    if (root->right != nullptr && root->val + 1 == root->right->val)
    {
        result = max(result, rightResult + 1);
    }

    if (result > m_longestValue)
    {
        m_longestValue = result;
    }

    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值