本篇记录前序化线索二叉树:
前序化二叉树,就是在没有存放孩子节点的位置存放在前序遍历中该节点的前驱或者后继;
建立基本的二叉树和线索二叉树的结构体在博客线索二叉树(一)中;
**创建前序化线索二叉树:**
void MakePre(BiThrNode *ptr,BiThrNode *p)
{
if (ptr != NULL)
{
if (ptr->leftchild == NULL)
{
ptr->leftchild = p;
ptr->Ltag = THREAD;
}
if(p != NULL&&p->rightchild == NULL)
{
p->rightchild = ptr->rightchild;
ptr->Rtag == THREAD;
}
p=ptr; //先遍历根节点,再向左边和右边遍历
MakePre(ptr->leftchild,p);
MakePre(ptr->rightchild,p);
}
}
void MakeThreadTreeBYpre(BiThrNode *ptr)//建立前序遍历线索二叉树
{
BiThrNode *p=NULL; //记住访问过的结点
MakePre(ptr,p);
p->rightchild = NULL;
}
非递归前序遍历线索二叉树:
void ThrPreOder(BiThrNode*ptr)
{
assert(ptr);
while(ptr != NULL)
{
printf("%c ",ptr->data);
if(ptr->Ltag==LINK) //如果有左孩子,打印左孩子结点
{
ptr=ptr->leftchild;
}
else
{
ptr=ptr->rightchild; //否则打印右孩子,即使右边的地址是后继,也刚好是需要打印的数据
}
}
}