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 源码
细节:
- 不能直接用longestConsecutive递归(无法返回m_lengthLongest,只能返回以根节点开始的最长序列长度)。
- 当前结点对比左右子树的返回值时,需要打擂台确定最大值,还要考虑叶子结点的情况。
- 如果左右都不能连续,则长度需要归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;
}