不用栈和递归,实现线索化二叉树的遍历(还没人看的话就沉了吧) [复制链接] fzy20062008 35 主题 820 帖子 1453 积分 王道论坛高级道友 考研年份 2013 报考学校 华南理工大学 本科学校 西藏大学 注册时间 2012-3-1 最后登录 2013-9-24 发消息 电梯直达 1楼 发表于 2012-4-24 13:05 | 只看该作者 本帖最后由 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)前序沿前驱遍历,后序沿后继遍历,不使用栈或者递归就无法实现!!