Problem
Given a binary tree, find the length of the longest consecutive sequence path.
The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to be from parent to child (cannot be the reverse).
For example,
1 \ 3 / \ 2 4 \ 5Longest consecutive sequence path is
3-4-5
, so return
3
.
2 \ 3 / 2 / 1Longest consecutive sequence path is
2-3
,not
3-2-1
, so return
2
.
Solution
从上到下DFS到达某个节点(curNode)时,要想知道当前以它为结束的最长序列长度(curLen)时,
1. 需要知道它的父节点的值(preVal)和以它父节点为结尾的最大长度(preLen)。这样就是需要两个variable preLen 和 preVal传值到当前函数。
2. 因为是从上到下DFS,除了知道以当前节点为结束点的最大长度(curLen)之外,还需要知道它的左右子树的最大长度。
比较三个值的最大值就是结果。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
int helper(TreeNode* root, int preVal, int preLen){
if(!root) return preLen;
int curLen = root->val == preVal + 1 ? preLen + 1 : 1;
return max(curLen, max( helper(root->left, root->val, curLen), helper(root->right, root->val, curLen)));
}
public:
int longestConsecutive(TreeNode* root) {
if(!root) return 0;
return helper(root, 0, root->val - 1);
}
};