先序遍历线索树
先序遍历线索树的前驱
先序的前驱: 1、该结点是根,不存在前驱 2、该结点是左孩子,前驱是父节点。 3、该结点是右孩子且没有左孩子,前驱为父结点。 4、该结点为右孩子,且存在左孩子,前驱为左孩子子树中的先序最后遍历结点。
用非递归的先序遍历来实现,一个p作为工作指针,一个pre指向前驱。
先序遍历线索树的后继
//choose 1:
BiThrNode *PreNext(BiThrNode *p)
{
BiThrNode *q;
if(p->Ltag==0) q=p->lchild;//如果没有线索化,返回左孩子结点
else q=p->rchild;//如果线索化了,就直接返回rchild
return q;
}
//choos 2:
BiThrTree *PreNext(BiThrThee *p)
{
if(p->Rtag == 1)//如果线索化了,就直接返回rchild
next = p->rchild;
//如果没有线索化,且左孩子结点不为空,则返回左孩子结点,若为空则返回右孩子结点
else if(p->lchild){
next = p->lchild;
}else{
next = p->rchild;
}
return next;
}
中序遍历线索树
中序遍历线索树画图
中序遍历线索树结构体
中序遍历线索化
中序线索树的二叉遍历
中序遍历线索树的前驱
//choose 1:
ThreadNode *PreNode(ThreadNode *p){
if(p->ltag==1){
p=p->lchild;
}else{
p=LastNode(p->lchild);
}
return p;
}
//找到以p为根的子树中,最后一个被中序遍历的结点,即就是左孩子的最右孩子结点就是中序遍历的前驱
ThreadNode *LastNode(ThreadNode *p){
while(p->rtag==0){
p=p->rchild;
}
return p;
}
//choose 2:
BiThrTree InPre(BiThrThee p)
{
if(p->Ltag == 1)
pre = p->LChild;
else{
for(q=p->LChild;q->Rtag==0;q=q->RChild)//这里代替了choose1的LastNode方法
pre = q;
}
return pre;
}
中序遍历线索树的后继
//choose 1:
ThreadNode *NextNode(ThreadNode *p){
if(p->rtag==1){
p=p->rchild;
}else{
p=FirstNode(p->rchild);
}
return p;
}
//找到以p为根的子树中,第一个被中序遍历的结点,即该节点右孩子的最左孩子结点
ThreadNode *FirstNode(ThreadNode *p){
while(p->ltag==0){
p=p->lchild;
}
return p;
}
//choos 2:
BiThrTree InNext(BiThrThee p)
{
if(p->Rtag == 1)
next = p->RChild;
else{
for(q=p->RChild;q->Ltag==0;q=q->LChild)
next = q;
}
return next;
}
后序遍历线索树
后序遍历线索树找前驱
BiThrTree PostPre(BiThrThee p)
{
if(p->Ltag == 1)
pre = p->LChild;
else if(p->RChild){
pre = p->RChild;
}else{
pre = p->LChild;
}
return pre;
}
后序遍历线索树找后继
后序遍历的后继: 1、该结点是根,不存在后继 2、该结点是右孩子,后继是父结点 3、该结点是左孩子且没有右孩子,后继是父结点 4、该结点是左孩子且存在右孩子,后继为右孩子子树中后序遍历第一个结点