线索二叉树:建立二叉树,通过中序遍历建立中序线索二叉树,中序线索二叉树的递归遍历;

#include 

using namespace std;
//线索二叉树,建立二叉树,通过中序遍历建立中序线索二叉树,中序线索二叉树的递归遍历。

typedef struct ThreadNode{
    char data;
    struct ThreadNode *lchild,*rchild;
    int ltag,rtag;
}ThreadNode,*ThreadTree;
ThreadNode  *pre=new ThreadNode;
/*初始化*/
void initial(ThreadTree &T){
	T = (ThreadNode*)malloc(sizeof(ThreadNode));
	T->lchild = NULL;
	T->rchild = NULL;
}
/*建立二叉树*/
void CreateThreadTree(ThreadTree &T)
{
    char ch;
    if((ch=getchar())=='#')//输入:AB##CD##EF##G##
        T=NULL;
    else
    {
        T=(ThreadNode*)malloc(sizeof(ThreadNode));
        T->data=ch;
        CreateThreadTree(T->lchild);
        CreateThreadTree(T->rchild);
    }
}
/*访问结点*/
void visit(ThreadTree &T){
    printf("%c",T->data);
}
/*先序遍历*/
void PreTraverse(ThreadTree T)
{
    if(T!=NULL)
    {
        visit(T);
        PreTraverse(T->lchild);
        PreTraverse(T->rchild);
       }
}
/*通过中序遍历对二叉树线索化*/
void InThread(ThreadTree &p){
    if(p!=NULL){
        InThread(p->lchild);
        if(p->lchild==NULL){
            p->lchild=pre;
            p->ltag=1;
        }
        else{
            p->ltag=0;
        }
        if(pre!=NULL&&pre->rchild==NULL){
            pre->rchild=p;
            pre->rtag=1;
        }
        else{
            pre->rtag=0;
        }
        pre=p;
        InThread(p->rchild);
    }
}
/*通过中序遍历建立中序线索二叉树*/
void CreateInThread(ThreadTree T){
    if(T!=NULL){
        InThread(T);
        pre->rchild=NULL;
        pre->rtag=1;
    }
}
ThreadNode *Firstnode(ThreadNode *p){
    while(p->ltag==0)
        p=p->lchild;
    return p;
}
ThreadNode *Nextnode(ThreadNode *p){
    if(p->rtag==0)
        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;
    initial(T);
    cout<<"先序创建树(输入#停止生成节点):\n";
    CreateThreadTree(T);
    cout<<"先序遍历:\n";
    PreTraverse(T);
    cout<<"\n通过中序遍历建立中序线索二叉树。\n";
    CreateInThread(T);
    cout<<"中序遍历线索二叉树:\n";
    Inorder(T);
    return 0;
}

你可能感兴趣的:(c++)