Sto provando a creare un algoritmo che crea un albero di ricerca binaria completo con un elenco di valori. Completa, in quanto tutti i livelli sono pieni tranne forse l'ultimo livello, che deve avere tutti gli elementi spostati il più a sinistra possibile.Creare un albero di ricerca binaria completo dalla lista
Ho implementato qualcosa (in Python) che creerà un BST equilibrato, in questo modo:
# TreeNode constructor takes (data, left, right, parent)
def make_tree(arr, parent):
if not arr:
return None
length = len(arr)
if length == 1:
return TreeNode(arr[0], None, None, parent)
else:
mid = int(len(arr)/2)
mid_node = TreeNode(arr[mid], None, None, parent)
mid_node.left = make_tree(arr[0:mid], mid_node)
mid_node.right = make_tree(arr[mid+1:length], mid_node)
return mid_node
Agisce in modo ricorsivo dividendo l'elenco per il punto medio, e facendo il punto medio di un nodo padre.
Tuttavia, ciò non crea uno completo BST. Data la lista [2,4,7,8,10], si creerà questo:
7
/ \
4 10
/ /
2 8
Ma un BST completa sarebbe simile a questa:
8
/ \
4 10
/\
2 7
Avete qualche suggerimento su come modificare il mio approccio per realizzare questo?
è necessario aggiungere le rotazioni di bilanciamento: P –
utilizzando 'int (len (arr)/2)' per trovare il nodo centrale non è giusto. Ad esempio, in un albero con undici nodi, il sottoalbero sinistro ha sette nodi e il sottoalbero destro ha tre nodi. Il tuo metodo attuale metterebbe cinque a sinistra e cinque a destra. – Kevin
Dovresti leggere su AVL Trees – Rerito