[Registro de escovação LeetCode] 31. Verifique o saldo

Oferta chega, cavar amigos para pegar! Estou participando do Evento Check-In de Recrutamento da Primavera de 2022, clique para ver os detalhes do evento .

1. Descrição do tópico:

Fonte do tópico: LeetCode - Checking Balance

Implemente uma função que verifica se uma árvore binária está balanceada. Neste problema, uma árvore balanceada é definida da seguinte forma: Para qualquer nó, a diferença de altura entre suas duas subárvores não excede 1.

Exemplo 1:

Dada uma árvore binária [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7
复制代码

Retorna verdadeiro.

Exemplo 2:

Dada uma árvore binária [1,2,2,3,3,null,null,4,4]

      1
     / \
    2   2
   / \
  3   3
 / \
4   4
复制代码

Retorna falso .

2. Análise de pensamento:

Ideia um:

De acordo com a definição de equilíbrio, calcule a altura das subárvores esquerda e direita de cada nó.

Se a diferença de altura entre as subárvores esquerda e direita de um nó for maior que 1, ela será desbalanceada, retornará false e terminará; caso contrário, significa que a subárvore com raiz no nó atual está balanceada e continua verificando o equilíbrio das subárvores esquerda e direita do nó atual.

Calcular a altura de uma árvore binária

Recursão, a altura da árvore binária atual = max(altura da subárvore esquerda, altura da subárvore direita) + 1max(altura da subárvore esquerda, altura da subárvore direita)+1

A altura da subárvore esquerda é calculada da mesma maneira

Se o nó atual for nulo, retorne 0, que é a saída recursiva

De acordo com o método de decomposição acima, a saída recursiva pode ser alcançada

Ideia dois:

De cima para baixo, cada nó é julgado uma vez

Terceira ideia:

De baixo para cima, crie um método que calcule a altura máxima e retorne -1 se a diferença entre esquerda e direita for maior que 1

3. Código CA:

4. Resumo:

Ideia um:

    class Solution {
        public boolean isBalanced(TreeNode root) {
            if (root == null) return true;
            int leftTreeD = treeDepth(root.left);
            int rightTreeD = treeDepth(root.right);
            if (Math.abs(leftTreeD - rightTreeD) > 1) return false;
            return isBalanced(root.left) && isBalanced(root.right);
        }

        public int treeDepth(TreeNode root) {
            if (root == null) return 0;
            return Math.max(treeDepth(root.left), treeDepth(root.right)) + 1;
        }
    }
复制代码

Ideia dois:

    class Solution {

        public boolean isBalanced(TreeNode root) {
            if (root == null) {
                return true;
            }
            if (Math.abs(check(root.left) - check(root.right)) > 1) {
                return false;
            }
            return isBalanced(root.left) && isBalanced(root.right);
        }

        public int check(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int maxLong = Math.max(check(root.left), check(root.right)) + 1;
            return maxLong;
        }
    }
复制代码

Terceira ideia:

    class Solution {
        public boolean isBalanced(TreeNode root) {
            return recursion(root) != -1;
        }

        private int recursion(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int leftValue = recursion(root.left);
            if (leftValue == -1) {
                return -1;
            }
            int rightValue = recursion(root.right);
            if (rightValue == -1) {
                return -1;
            }
            if (Math.abs(leftValue - rightValue) > 1) {
                return -1;
            }
            return Math.max(leftValue, rightValue) + 1;
        }
    }
复制代码

Acho que você gosta

Origin juejin.im/post/7079744525102481415
Recomendado
Clasificación