c++二叉树的中序线索链表

来源:互联网 发布:手机淘宝生日在哪设置 编辑:程序博客网 时间:2024/06/08 09:26
<div class="para" label-module="para">建立线索二叉树,或者说对二叉树线索化,实质上就是遍历一棵二叉树。在遍历过程中,访问结点的操作是检查当前的左,右指针域是否为空,将它们改为指向前驱结点或后续结点的线索。为实现这一过程,设指针pre始终指向刚刚访问的结点,即若指针p指向当前结点,则pre指向它的前驱,以便设线索。</div><div class="para" label-module="para"> </div><div class="para" label-module="para"><img src="http://img.blog.csdn.net/20161018143644296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></div><div class="para" label-module="para"> </div>
#include <iostream>using namespace std;enum flag {Child,Thread};//child为0,thread为1struct ThrNode{    char data;    ThrNode *lchild,*rchild;    flag ltag,rtag;};class InThrBiTree{public:    InThrBiTree();    ThrNode *Next(ThrNode *p);    void InOrder();private:    ThrNode *root,*p,*q;    ThrNode *Creat(ThrNode *bt);    void ThrBiTree(ThrNode *bt);};ThrNode *pre=NULL;//定义pre(前驱)为空ThrNode *InThrBiTree::Creat(ThrNode *bt){    char ch;    cin>>ch;    if(ch=='#')bt=NULL;    else    {        bt=new ThrNode;        bt->data=ch;        bt->ltag=Child;        bt->rtag=Child;        bt->lchild=Creat(bt->lchild);        bt->rchild=Creat(bt->rchild);    }    return bt;}void InThrBiTree::ThrBiTree(ThrNode *bt)//中序线索化链表算法{    if(bt!=NULL)    {        if(bt->ltag==Child)//左线索为0,即有左孩子时,继续递归            ThrBiTree(bt->lchild);        if(bt->lchild==NULL)//直到左孩子为空,即左线索为1时        {            bt->ltag=Thread;            bt->lchild=pre;//pre初值为空        }        if(bt->rchild==NULL)//若右孩子为空,即右线索为1时            bt->rtag=Thread;        if(pre!=NULL&&pre->rtag==Thread)//若前驱非空且前驱的右线索为1(没有右孩子)时            pre->rchild=bt;//前驱的右孩子就为bt        pre=bt;//令bt为新的pre        if(bt->rtag==Child)//若左线索为0,即左孩子存在时,继续递归            ThrBiTree(bt->rchild);    }}InThrBiTree::InThrBiTree(){    root=Creat(root);    ThrBiTree(root);//建立线索}ThrNode *InThrBiTree::Next(ThrNode *p)//查找后继算法{    q=new ThrNode;    if(p->rtag==Thread)//若标志为1,即没有右孩子        q=p->rchild;//可以直接得到后继结点    else    {        q=p->rchild;        while(q->ltag==Child)//否则一直寻找直到左线索为0,即有左孩子时        {            q=q->lchild;   //得到后继        }    }    return q;//返回后继结点(指针)}void InThrBiTree::InOrder(){    if(root==NULL)return;    p=root;    while(p->ltag==Child)    {        p=p->lchild;    }    cout<<p->ltag<<" "<<p->data<<" "<<p->rtag<<endl;    while(p->rchild!=NULL)    {        p=Next(p);        cout<<p->ltag<<" "<<p->data<<" "<<p->rtag<<endl;    }}int main(){    InThrBiTree b;    b.InOrder();    return 0;}
 
0 0
原创粉丝点击