#include<bits/stdc++.h>
using namespace std;
typedef char eletype;
typedef struct node{
struct node *left;
struct node *right;
eletype value;
int ltag,rtag;
}Treenode,*Treeroot;
//1.先序建树
void crttree(Treeroot *root)
{
eletype c=getchar();
getchar();
if(c!='/')
{
*root=new Treenode;
(*root)->value=c;
crttree(&(*root)->left);
crttree(&(*root)->right);
}
else{
(*root)=NULL;
}
}
//2.二叉树的中序线索化
Treeroot pre=NULL;
void Z_XSH(Treeroot root){
if(root!=NULL){
Z_XSH(root->left);
if(root->left==NULL){
root->ltag=1;
root->left=pre;
}
if(pre!=NULL&&pre->right==NULL){
pre->rtag=1;
pre->right=root;
}
pre=root;
Z_XSH(root->right);
}
}
//3.遍历中序线索树--寻找中序线索二叉树下的第一个节点
Treenode *firstnode(Treeroot root){
while(root!=NULL&&root->ltag==0)
{
root=root->left;
}
return root;
}
//4.遍历中序线索树--中序线索树下的下一个节点
Treenode *nextnode(Treenode *p){
if(p->rtag==1){
return p->right;
}else{
Treenode *q=p->right;
while(q->ltag==0){
q=q->left;
}
return q;
}
}
//4.中序线索二叉树的遍历
void Bianli(Treeroot root){
Treenode *first=firstnode(root);
if(first!=NULL){
cout<<first->value<<endl;
Treenode *next=nextnode(first);
while(next!=NULL){
cout<<next->value<<endl;
next=nextnode(next);
}
}
}
int main()
{
Treeroot P;
crttree(&P);
cout<<endl;
cout<<"中序线索二叉树的遍历:"<<endl;
Z_XSH(P);
Bianli(P);
}
运行结果: