Birisi yığın veya özyineleme kullanmadan aşağıdaki Morris sıralı ağaç çaprazlama algoritmasını anlamama yardımcı olabilir mi? Nasıl çalıştığını anlamaya çalışıyordum ama bu benden kaçıyor.
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
Ağacın bir şekilde modifiye anlamak current node
, yapılır right child
arasında max node
yer right subtree
ve inorder kastetmek için bu özelliği kullanın. Ama bunun ötesinde, kayboldum.
DÜZENLEME: Bu beraberindeki c ++ kodunu bulduk. Ağacın değiştirildikten sonra nasıl restore edildiğini anlamakta zorlanıyordum. Sihir else
, sağ yaprak değiştirildiğinde vurulan maddede yatmaktadır . Ayrıntılar için koda bakın:
/* 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 */
}
pre->right = NULL;