题目地址:
https://leetcode.com/problems/binary-tree-longest-consecutive-sequence/
给定一棵二叉树,问从上到下的、且数字是连续递增数字的路径(意思是形如 x , x + 1 , x + 2 , . . . , x + k x,x+1,x+2,...,x+k x,x+1,x+2,...,x+k这样的路径)中最长的长度。
思路是DFS。将路径按照从哪个节点开始分类,每次到达一个节点的时候就去计算以当前节点开始的连续数字的路径的最长长度,然后更新答案即可。代码如下:
public class Solution {
private int res;
public int longestConsecutive(TreeNode root) {
dfs(root);
return res;
}
// 从root开始DFS,返回以root开始的最长的连续数字路径的长度
private int dfs(TreeNode root) {
if (root == null) {
return 0;
}
// 初始化长度为1
int len = 1;
// 求出以左子树根和右子树根为出发点的最长路径长度
int left = dfs(root.left), right = dfs(root.right);
// 如果左子树根能接到root上,就更新len
if (root.left != null && root.left.val == root.val + 1) {
len = Math.max(len, 1 + left);
}
// 如果右子树根能接到root上,也更新len
if (root.right != null && root.right.val == root.val + 1) {
len = Math.max(len, 1 + right);
}
// 更新答案
res = Math.max(res, len);
// 返回以root开始的最长的连续数字路径的长度
return len;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。