线索化可以提高遍历效率,线索化的过程是在遍历的过程中完成的,**线索化对应**遍历,见码子: #include<iostream>//需要一个表头,表头具有的性质是:左指针指向二叉树根节点,右指针为空,左线索指向**遍历的第一个节点,右线索指向**遍历的最后一个节点 using namespace std; #define go printf("/n"); typedef struct th { int data; struct th *left,*right,*pre,*succ; }tree; tree* creat(tree *root,int val) { tree *newroot; if(NULL==root) { newroot=new tree; newroot->data=val; newroot->left=newroot->right=NULL; return newroot; } if(val<=root->data) root->left=creat(root->left,val); else root->right=creat(root->right,val); return root; } /*中序线索化就是在中序遍历的过程中,附设一个prev的指针,其表示当前访问节点的前驱*/ void inthread_lbr(tree *p,tree* &prev)//按中序遍历线索化 { if(p) { inthread_lbr(p->left,prev);//左子树线索化 prev->succ=p;//建立线索 p->pre=prev; prev=p; inthread_lbr(p->right,prev);//右子树线索化 } } void th_lbr(tree* &h,tree *t)//此函数用于建立线索,中序遍历线索化二叉树,h是表头,t是待线索化的二叉树根节点 { tree *prev; h=new tree; h->left=t,h->right=NULL; if(t==NULL) { h->pre=h; h->succ=h; } else { prev=h; inthread_lbr(t,prev); prev->succ=h; h->pre=prev; } } //以中序全线索链表做存储结构时的中序遍历算法 void lbr(tree *head)//线索化后中序遍历,head为表头 { tree *tmp; tmp=head->succ; while(tmp!=head) { printf("%d ",tmp->data); tmp=tmp->succ; } } void inthread_blr(tree *p,tree* &prev)//按前序遍历线索化 { if(p) { prev->succ=p;//根节点线索化 p->pre=prev; prev=p; inthread_blr(p->left,prev);//左子树线索化 inthread_blr(p->right,prev);//右子树线索化 } } void th_blr(tree* &h,tree *t)//先根遍历线索化二叉树,h依然是表头,t依然…… { tree *prev;//搞个当前访问节点的前驱节点先 h=new tree; h->left=t; h->right=NULL; if(NULL==t) { h->pre=h; h->succ=h; } else { prev=h; inthread_blr(t,prev); prev->succ=h; h->pre=prev; } } void blr(tree *head)//传表头 { tree *tmp; tmp=head->succ; while(tmp!=head) { printf("%d ",tmp->data); tmp=tmp->succ; } } void inthread_lrb(tree *p,tree* &prev)//按后根遍历线索化 { if(p) { inthread_lrb(p->left,prev); inthread_lrb(p->right,prev); prev->succ=p; p->pre=prev; prev=p; } } void th_lrb(tree* &h,tree *t)//后根遍历线索化二叉树 { tree *prev; h=new tree; h->left=t,h->right=NULL; if(NULL==t) h->pre=h->succ=h; else { prev=h; inthread_lrb(t,prev); prev->succ=h; h->pre=prev; } } void lrb(tree *head)//线索化后后根遍历 { tree *tmp; tmp=head->succ; while(tmp!=head) { printf("%d ",tmp->data); tmp=tmp->succ; } } int main() { int n; tree *tmp=NULL,*h; while(scanf("%d",&n),n+1) tmp=creat(tmp,n);//建树 th_lbr(h,tmp);//中序线索化 lbr(h);//中序遍历线索化后的树 go th_blr(h,tmp);//先根线索化 blr(h);//先跟遍历 go th_lrb(h,tmp);//后根线索化 lrb(h);//后根遍历 go return false; }