线索二叉树的创建,中序线索化和中序遍历(严蔚敏版数据结构实现)


#include<stdio.h>

#include<iostream>

#include<cstdio>

using namespace std;

 

#define OK 1

#define ERROR 0

#define OVERFLOW -1

 

typedef int Status;

typedef char TElemType;

 

/*线索二叉树的结构*/

typedef enum PointerTag{Link,Thread};//Link==0,指针;Thread==1,线索

typedef struct BiThrNode

{

        TElemType data;    //结点数据

        PointerTag ltag, rtag;//左右标志

        struct BiThrNode *lchild,*rchild;//左右孩子指针

}BiThrNode,*BiThrTree;

 

Status PrintElement(TElemType e)// 输出结点里面的值

{

        cout << e;

        return OK;

}

 

// 创建线索二叉树

Status CreateBiThrTree(BiThrTree &T)

{

        char ch;

        cin >> ch;

        if (ch == '!')

                 T = NULL;

        else

        {

                 if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))

                         exit(OVERFLOW);

                 T->data = ch;

                 T->ltag = Link;

                 T->rtag = Link;

                 CreateBiThrTree(T->lchild);

                 CreateBiThrTree(T->rchild);

        }

        return OK;

}

 

// T指向头结点,头结点的lchild指向根节点,中序遍历线索二叉树

Status InOrderTraverse_Thr(BiThrTree T, Status(*Visit)(TElemType e))

{

        BiThrTree p = T->lchild;

        while (p&&(p != T))

        {

                 while (p->ltag == Link)

                 {                      

                         p = p->lchild;

                 }

                 Visit(p->data);

                 while (p->rtag == Thread && p->rchild != T)

                 {

                         p = p->rchild;

                         Visit(p->data);

                 }

                 p = p->rchild;

        }

        return OK;

}

 

 

// 中序遍历进行二叉树线索化

void InThreading(BiThrTree p,BiThrTree &pre)

 

{

        if (p)

        {

                 InThreading(p->lchild,pre);//左子树线索化

                 if (!p->lchild)

                 {

                         p->ltag = Thread;

                         p->lchild = pre;//前驱线索

                 }

                 if ((!pre->rchild)&&pre->rchild==NULL)

                 {

                         pre->rtag = Thread;

                         pre->rchild = p;//后继线索

                 }

                 pre = p;

                 InThreading(p->rchild, pre);//右子树线索化

        }

}

 

//中序遍历并线索化二叉树T,Thrt指向头结点

Status InOrderThreading(BiThrTree &Thrt, BiThrTree T)

{

        if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode))))   //建立头结点

                 exit(OVERFLOW);

        Thrt->ltag = Link;

        Thrt->rtag = Thread;

        Thrt->rchild = Thrt;//右指针回指

        BiThrTree pre;

        if (!T)

                 Thrt->lchild = Thrt;//若二叉树为空,则左指针回指

        else

        {

                 Thrt->lchild = T;

                 pre = Thrt;

                 InThreading(T,pre);//中序遍历进行中序线索化

                 pre->rchild = Thrt;//最后一个结点线索化

                 pre->rtag = Thread;

                 Thrt->rchild = pre;

        }

        return OK;

}

 

 

 

void main(){

        BiThrTree T, Thrt;

        cout << "创建线索二叉树,按先序次序输入线索二叉树中结点的值:\n";

        CreateBiThrTree(T);

        if (InOrderThreading(Thrt, T) == OK)

                 cout << "成功建立中序线索化链表!\n";

        cout << "中序遍历线索二叉树,结果是:\n";

        InOrderTraverse_Thr(Thrt, PrintElement);

        cout << endl;

}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM