¿Puede alguien ayudarme a entender el siguiente algoritmo de cruce de árbol inorder de Morris sin usar pilas o recursión? Estaba tratando de entender cómo funciona, pero me está escapando.Explicar el recorrido del árbol inorder de Morris sin utilizar pilas o recursión
1. Initialize current as root
2. While current is not NULL
If current does not have left child
a. Print current’s data
b. Go to the right, i.e., current = current->right
Else
a. In current's left subtree, make current the right child of the rightmost node
b. Go to this left child, i.e., current = current->left
entiendo el árbol se modifica de manera que el current node
, se realiza la right child
del max node
en right subtree
y utilizar esta propiedad para recorrido en orden. Pero más allá de eso, estoy perdido.
EDIT: Se encuentra este código de C++ que lo acompaña. Estaba teniendo dificultades para entender cómo se restaura el árbol después de que se modificó. La magia se encuentra en la cláusula else
, que se activa una vez que se modifica la hoja derecha. Ver código para la descarga:
/* Function to traverse binary tree without recursion and
without stack */
void MorrisTraversal(struct tNode *root)
{
struct tNode *current,*pre;
if(root == NULL)
return;
current = root;
while(current != NULL)
{
if(current->left == NULL)
{
printf(" %d ", current->data);
current = current->right;
}
else
{
/* Find the inorder predecessor of current */
pre = current->left;
while(pre->right != NULL && pre->right != current)
pre = pre->right;
/* Make current as right child of its inorder predecessor */
if(pre->right == NULL)
{
pre->right = current;
current = current->left;
}
// MAGIC OF RESTORING the Tree happens here:
/* Revert the changes made in if part to restore the original
tree i.e., fix the right child of predecssor */
else
{
pre->right = NULL;
printf(" %d ",current->data);
current = current->right;
} /* End of if condition pre->right == NULL */
} /* End of if condition current->left == NULL*/
} /* End of while */
}
que nunca había oído antes de este algoritmo. Muy elegante! –
Pensé que podría ser útil indicar [la fuente del código pseudo-código +] (http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/) (presumiblemente) – Dukeling
fuente: http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/ – DebashisDeb