Un albero binario è bilanciato in altezza se e solo se i due sottoalberi di root sono bilanciati in altezza e la differenza tra l'altezza dei due sottoalberi è al massimo 1.
Ho implementato un codice in java per scoprire se un albero di ricerca binario è bilanciato in altezza o meno. L'ho fatto in questo modo:
Richiama ricorsivamente la funzione isBalanced(Node)
che inizia con root e la condizione di base è se il nodo è null restituisce true. Ma per calcolare l'altezza di un sottoalbero radicato in Node x
, devo chiamare una funzione separata getHeight(Node)
su quel nodo e usare questa funzione per ottenere e confrontare l'altezza di due sottoalberi di un nodo e restituire di conseguenza un valore booleano.
Ma questa chiamata di funzione separata sta rendendo il mio codice inefficiente, perché in caso di albero di skew quando ogni nodo ha un figlio questa funzione farà sì che la complessità temporale del mio programma sia O(N^2)
, N è il numero di vertici.
Quello che voglio sapere è che c'è un modo per rimuovere questa chiamata di funzione separata e continuare a svolgere il lavoro, in modo che possa avere un algoritmo lineare di tempo.
Ecco il mio codice java.
class BST
{
public Node insert(Node x,int key)
{
if(x==null)
return new Node(key,null,null);
else if(key>x.key)
{
x.right=insert(x.right,key);
return x;
}
else if(key<x.key)
{
x.left=insert(x.left,key);
return x;
}
else {x.key=key;return x;}
}
public boolean isBalanced(Node root)
{
if(root==null)
return true;
else
{
if(isBalanced(root.left)&&isBalanced(root.right))
{
if(Math.abs(getHeight(root.left)-getHeight(root.right))<=1)
return true;
else return false;
}
else return false;
}
}
public int getHeight(Node x)
{
return BFS(x,0);
}
public int BFS(Node x,int h)
{
if(x==null)
return h;
return Math.max(BFS(x.right,h+1),BFS(x.left,h+1));
}
public static void main(String []args)
{
BST tree1=new BST();
Node root=null;
root=tree1.insert(root,14);
root=tree1.insert(root,16);
root=tree1.insert(root,5);
root=tree1.insert(root,3);
root=tree1.insert(root,12);
root=tree1.insert(root,10);
root=tree1.insert(root,13);
root=tree1.insert(root,20);
root=tree1.insert(root,18);
root=tree1.insert(root,23);
root=tree1.insert(root,15);
System.out.println(tree1.isBalanced(root));
}
}
class Node
{
Node left,right;
int key;
Node(int key,Node left,Node right)
{
this.key=key;
this.left=left;
this.right=right;
}
}
Sto ripubblicando questa domanda qui perché non ho ricevuto risposta on Stack Overflow .