线索二叉树(thread tree)

//a(b(d,e(h(j,k(l,m(,n))))),c(f,g(,i))) #include<iostream> using namespace std; const int SIZE=10000; typedef struct TBTNode{ char data; struct TBTNode * lchild,*rchild; int ltag,rtag; }TBTNode; void createBtree(TBTNode * &bt,char *str){ TBTNode* st[SIZE],*p=NULL; int top=-1,k,j=0; char ch; bt=NULL; ch=str[j]; while(ch){ switch(ch){ case '(':top++;st[top]=p;k=1;break; case ')':top--; break; case ',':k=2;break; default: p=(TBTNode *)malloc(sizeof(TBTNode)); p->data=ch;p->lchild=p->rchild=NULL; if(bt==NULL) bt=p; else{ switch(k){ case 1:st[top]->lchild=p;break; case 2:st[top]->rchild=p;break; } } } j++; ch=str[j]; } } void display(TBTNode * bt){ if(bt!=NULL){ cout<<bt->data; if(bt->lchild!=NULL || bt->rchild!=NULL){ cout<<"("; display(bt->lchild); if(bt->rchild!=NULL) cout<<","; display(bt->rchild); cout<<")"; } } //cout<<endl; } TBTNode *pre; void Thread(TBTNode *&p){ if(p!=NULL){ Thread(p->lchild); if(p->lchild==NULL){ p->lchild=pre; p->ltag=1; } else p->ltag=0; if(pre->rchild==NULL){ pre->rchild=p; pre->rtag=1; } else pre->rtag=0; pre=p; Thread(p->rchild); } } TBTNode *CreaThread(TBTNode *bt){ TBTNode *head; head=(TBTNode *)malloc(sizeof(TBTNode)); head->ltag=0;head->rtag=1; head->rchild=bt; if(bt==NULL) head->lchild=head; else{ head->lchild=bt; pre=head; Thread(bt); pre->rchild=head; pre->rtag=1; head->rchild=pre; } return head; } //TBTNode *pre; //void Thread(TBTNode *&p){ // if(p!=NULL){ // Thread(p->lchild); // if(p->lchild==NULL){ // p->lchild=pre; // p->ltag=1; // } // else p->ltag=0; // if(pre->rchild==NULL){ // pre->rchild=p; // pre->rtag=1; // } // else pre->rtag=0; // pre=p; // Thread(p->rchild); // } //} //TBTNode * CreaThread(TBTNode *b){ // TBTNode *root; // root=(TBTNode* )malloc (sizeof(TBTNode)); // root->ltag=0;root->rtag=1; // root->rchild=b; // if(b==NULL) root->lchild=root; // else{ // root->lchild=b; // pre=root; // Thread(b); // pre->rchild=root; // pre->rtag=1; // root->rchild=pre; // } // return root; //} void ThInOrder(TBTNode *tb){ TBTNode *p=tb->lchild; while(p!=tb){ while(p->ltag==0) p=p->lchild; cout<<p->data; while(p->rtag==1 && p->rchild!=tb){ p=p->rchild; cout<<p->data; } p=p->rchild; } } int main(){ char str[100]; cin>>str; TBTNode *bt; createBtree(bt,str); display(bt); cout<<endl; TBTNode * btt; btt=CreaThread(bt); cout<<endl; cout<<"sequence:"; ThInOrder(btt); cout<<endl; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值