不用栈和递归,实现线索化二叉树的遍历(还没人看的话就沉了吧)
来源:互联网 发布:北京培训seo哪个好 编辑:程序博客网 时间:2024/05/04 10:11
不用栈和递归,实现线索化二叉树的遍历(还没人看的话就沉了吧)
35
主题820
帖子1453
积分王道论坛高级道友
本帖最后由 fzy20062008 于 2012-4-24 13:09 编辑
线索化二叉树的存储结构
ElemType struct
{
ElemType data;
struct ThreadNode *lichind,*rchild;
int ltag,rtag;
}ThreadNode, *ThreadTree;
实现算法
1)后序线索化二叉树沿前驱遍历
ThreadNode *Prenode(ThreadNode *p) //求后序线索树中结点p在后序序列下的前驱结点
{
if(p->rtag==0) return p->rchild; //有右孩子的话,则直接返回右孩子
else return p->lchild; //若没有右孩子,则直接返回左孩子(ltag==0)或者前驱(ltag==1)
}
void Reverse_PostOrder(ThreadNode *root) //沿前驱遍历后序线索二叉树(即逆向输出后序序列)
{
for(ThreadNode *p=root;p!=NULL;p=Prenode(p))
visit(p);
}
2)前序线索化二叉树沿后继进行遍历
ThreadNode *Nextnode(ThreadNode *p) //求前序线索树中结点p在前序序列下的后继结点
{
if(p->ltag==0) return p->lchild; //有左孩子的话,则直接返回左孩子
else return p->rchild; //若没有左孩子,则直接返回右孩子(rtag==0)或者后继(rtag==1)
}
void PreOrder(ThreadNode *root) //沿后继遍历前序线索二叉树(即输出前序序列)
{
for(ThreadNode *p=root;p!=NULL;p=Nextnode(p))
visit(p);
}
3)中序线索化二叉树沿前驱进行遍历
ThreadNode *Lastnode(ThreadNode *p) //求中序线索化二叉树中中序序列的最后一个结点
{
while(p->rtag==0) p=p->rchild;
return p;
}
ThreadNode *Prenode(ThreadNode *p) //求中序线索树中结点p在中序序列下的前驱结点
{
if(p->ltag==0) return Lastnode(p->lchild);
else return p->rchild;
}
void Reverse_InOrder(ThreadNode *root) //沿前驱遍历中序线索二叉树(即逆向输出中序序列)
{
for(ThreadNode *p=Lastnode(root);p!=NULL;p=Prenode(p))
visit(p);
}
4)中序线索化二叉树沿后继进行遍历(单科书P99给出的算法)
ThreadNode *Firstnode(ThreadNode *p)
{
while(p->ltag==0) p=p->lchild;
return p;
}
ThreadNode *Nextnode(ThreadNode *p)
{
if(p->rtag==0) return Firstnode(p);
else return p->rchild;
}
void Inorder(ThreadNode *root)
{
for(ThreadNode *p=Firsttnode(root);p!=NULL;p=Nextnode(p))
visit(p);
}
5)前序沿前驱遍历,后序沿后继遍历,不使用栈或者递归就无法实现!!
线索化二叉树的存储结构
ElemType struct
{
ElemType data;
struct ThreadNode *lichind,*rchild;
int ltag,rtag;
}ThreadNode, *ThreadTree;
实现算法
1)后序线索化二叉树沿前驱遍历
ThreadNode *Prenode(ThreadNode *p) //求后序线索树中结点p在后序序列下的前驱结点
{
if(p->rtag==0) return p->rchild; //有右孩子的话,则直接返回右孩子
else return p->lchild; //若没有右孩子,则直接返回左孩子(ltag==0)或者前驱(ltag==1)
}
void Reverse_PostOrder(ThreadNode *root) //沿前驱遍历后序线索二叉树(即逆向输出后序序列)
{
for(ThreadNode *p=root;p!=NULL;p=Prenode(p))
visit(p);
}
2)前序线索化二叉树沿后继进行遍历
ThreadNode *Nextnode(ThreadNode *p) //求前序线索树中结点p在前序序列下的后继结点
{
if(p->ltag==0) return p->lchild; //有左孩子的话,则直接返回左孩子
else return p->rchild; //若没有左孩子,则直接返回右孩子(rtag==0)或者后继(rtag==1)
}
void PreOrder(ThreadNode *root) //沿后继遍历前序线索二叉树(即输出前序序列)
{
for(ThreadNode *p=root;p!=NULL;p=Nextnode(p))
visit(p);
}
3)中序线索化二叉树沿前驱进行遍历
ThreadNode *Lastnode(ThreadNode *p) //求中序线索化二叉树中中序序列的最后一个结点
{
while(p->rtag==0) p=p->rchild;
return p;
}
ThreadNode *Prenode(ThreadNode *p) //求中序线索树中结点p在中序序列下的前驱结点
{
if(p->ltag==0) return Lastnode(p->lchild);
else return p->rchild;
}
void Reverse_InOrder(ThreadNode *root) //沿前驱遍历中序线索二叉树(即逆向输出中序序列)
{
for(ThreadNode *p=Lastnode(root);p!=NULL;p=Prenode(p))
visit(p);
}
4)中序线索化二叉树沿后继进行遍历(单科书P99给出的算法)
ThreadNode *Firstnode(ThreadNode *p)
{
while(p->ltag==0) p=p->lchild;
return p;
}
ThreadNode *Nextnode(ThreadNode *p)
{
if(p->rtag==0) return Firstnode(p);
else return p->rchild;
}
void Inorder(ThreadNode *root)
{
for(ThreadNode *p=Firsttnode(root);p!=NULL;p=Nextnode(p))
visit(p);
}
5)前序沿前驱遍历,后序沿后继遍历,不使用栈或者递归就无法实现!!