Me está costando más tiempo tratar de encontrar la forma de equilibrar un árbol AVL para mi clase. Tengo que insertando con esto:balanceando un árbol AVL (C++)
Node* Tree::insert(int d)
{
cout << "base insert\t" << d << endl;
if (head == NULL)
return (head = new Node(d));
else
return insert(head, d);
}
Node* Tree::insert(Node*& current, int d)
{
cout << "insert\t" << d << endl;
if (current == NULL)
current = new Node(d);
else if (d < current->data) {
insert(current->lchild, d);
if (height(current->lchild) - height(current->rchild)) {
if (d < current->lchild->getData())
rotateLeftOnce(current);
else
rotateLeftTwice(current);
}
}
else if (d > current->getData()) {
insert(current->rchild, d);
if (height(current->rchild) - height(current->lchild)) {
if (d > current->rchild->getData())
rotateRightOnce(current);
else
rotateRightTwice(current);
}
}
return current;
}
Mi plan era que las llamadas a equilibrar() comprobar para ver si las necesidades de los árboles de equilibrado y después equilibrar según sea necesario. El problema es que no puedo imaginar cómo atravesar el árbol para encontrar el nodo desequilibrado correcto. Sé cómo recorrer el árbol recursivamente, pero parece que no puedo traducir ese algoritmo para encontrar el nodo desequilibrado más bajo. También estoy teniendo problemas para escribir un algoritmo iterativo. Cualquier ayuda sería apreciada. :)
Por cierto, si usted está familiarizado con Java, 'para me' el libro * Estructuras de Datos y Algoritmos en Java, por Lafore * me ha ayudado mucho a entender estructuras de datos A pesar de que no tiene AVL, sí habla mucho sobre árboles Rojo-Negro, que 'i' si es más fácil. Una vez que los entiendas en Java, puedes hacerlo en cualquier otro idioma con el que estés familiarizado, el punto es comprender cómo funcionan. – Carlos
@Carlos: estoy de acuerdo en que, siempre que el lenguaje no sea críptico (perl ...) cualquier hará para demostrar la implementación de un algoritmo o estructura de datos. –