Dada uma árvore binária, você precisa encontrar o comprimento do caminho de sequência contínua mais longo na árvore binária.
Observe que o caminho pode ser crescente ou decrescente. Por exemplo, [1,2,3,4] e [4,3,2,1] são ambos considerados legais, enquanto o caminho [1,2,4,3] é ilegal. Por outro lado, o caminho pode ser a ordem filho-pai-filho, não necessariamente a ordem pai-filho.
Exemplo 1:
Entrada:
1
/
2 3
de saída: 2
Explicação: mais longo caminho contínuo [1, 2] ou [2, 1].
Exemplo 2:
Entrada:
2
/
1 3
de saída: 3
Explicação: mais longo caminho contínuo [1, 2, 3] ou [3, 2, 1].
Observação: os valores de todos os nós da árvore estão na faixa de [-1e7, 1e7].
Fonte: LeetCode (LeetCode)
Link: https://leetcode-cn.com/problems/binary-tree-longest-consecutive-sequence-ii Os
direitos autorais são propriedade de LeetCode . Para reimpressões comerciais, favor contatar a autorização oficial Para reimpressões não comerciais, favor indicar a fonte.
class Solution {
int maxVal = 0;
public int longestConsecutive(TreeNode root) {
longestPath(root);
return maxVal;
}
public int[] longestPath(TreeNode node) {
if (node == null) {
return new int[] {
0, 0};
}
// 节点本身是一个节点,所以这里初始化为1
int inc = 1; // 表示当前结点的最长递增序列长度
int dec = 1; // 表示当前节点的最长递减序列长度
if (node.left != null) {
int[] left = longestPath(node.left);
// 得到左孩子的最长递增或者递减序列
if ((node.left.val - 1) == node.val) {
inc += left[0];
}else if ((node.left.val + 1) == node.val) {
dec += left[1];
}
}
if (node.right != null) {
int[] right = longestPath(node.right);
if ((node.right.val + 1) == node.val) {
dec = Math.max(right[1] + 1, dec); // 取左孩子和右孩子的递减的序列长度的最大值
} else if ((node.right.val - 1) == node.val) {
inc = Math.max(right[0] + 1, inc); // 取左孩子和右孩子的递增的序列长度的最大值
}
}
maxVal = Math.max(maxVal, dec + inc - 1); // 因为可以是子父子的顺序,所以是dec+inc-1
return new int[] {
inc, dec};
}
}