Leetcode a sequência contínua mais longa em uma árvore binária

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};
    }

}

Acho que você gosta

Origin blog.csdn.net/liu_12345_liu/article/details/102750861
Recomendado
Clasificación