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;
}
}
复制代码