中序遍歷線索二叉樹
阿新 • • 發佈:2019-01-01
中序遍歷線索二叉樹的實現與操作
二叉線索樹的結構定義
typedef enum{Link, Thread}PointerTag;
typedef struct ThreadNode
{
char data;
ThreadNode *lchild, *rchild;
PointerTag ltag, rtag;
}ThreadNode, *ThreadTree;
建立一棵二叉樹
void CreateBiTree(ThreadTree &T)
{
char c;
cin >> c;
if(c=='*')T=NULL;
else
{
T=(ThreadTree)malloc(sizeof(ThreadNode));
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
建立一棵二叉樹及二叉樹基本操作
void CreateBiTree(ThreadTree &T)
{
char c;
cin >> c;
if(c=='*')T=NULL;
else
{
T=(ThreadTree)malloc(sizeof(ThreadNode));
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void visit(ThreadTree T )
{
if(T)
{
cout << T->data << "(" << T->ltag << "," << T->rtag << ")" << " ";
}
}
void PreOrderTraveral(ThreadTree T)
{
if(T)
{
visit(T);
PreOrderTraveral(T->lchild);
PreOrderTraveral(T->rchild);
}
}
void InOrderTraverse(ThreadTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
visit(T);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(ThreadTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
visit(T);
}
}
中序遍歷二叉樹線索化的遞迴演算法
//中序遍歷二叉樹線索化的遞迴演算法
void InThread(ThreadTree &p, ThreadTree &pre)
{
if(p!=NULL)
{
InThread(p->lchild, pre); //遞迴線索化左子樹
if(p->lchild==NULL) //左子樹為空,建立前驅線索
{
p->lchild=pre;
p->ltag=Thread;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rchild=p; //建立前驅結點的後續線索
pre->rtag=Thread;
}
pre=p;
InThread(p->rchild, pre); //遞迴線索化
}
}
通過中序遍歷建立中序線索二叉樹
//通過中序遍歷建立中序線索二叉樹
void CreateInThread(ThreadTree T)
{
ThreadTree pre=NULL;
if(T!=NULL)
{
InThread(T, pre);
pre->rchild=NULL;
pre->rtag=Thread;
}
}
中序遍歷
//求中序線索二叉樹中中序序列的第一個結點
ThreadNode *Firstnode(ThreadNode *p)
{
while(p->ltag!=Thread)
{
p=p->lchild;
}
return p;
}
//求中序線索二叉樹結點p在中序序列下的後繼結點
ThreadNode *Nextnode(ThreadNode *p)
{
if(p->rtag!=Thread)
{
return Firstnode(p->rchild);
}
else
{
return p->rchild;
}
}
//中序遍歷
void InOrder(ThreadNode *T)
{
for(ThreadNode *p=Firstnode(T); p!=NULL; p=Nextnode(p))
{
visit(p);
}
}
主函式
int main()
{
ThreadTree T=NULL;
CreateBiTree(T);
InOrderTraverse(T);
cout << endl;
CreateInThread(T);
InOrder(T);
return 0;
}