线索化二叉树(中序)

来源:互联网 发布:神州律师网网络培训 编辑:程序博客网 时间:2024/05/17 05:12
 
#include <cstdio>#include <cstdlib>typedef char ElemType;typedef enum {Link, Thread} PointerTag;      //Link = 0, Thread = 1; typedef struct BiThrNode{char data;struct BiThrNode *lchild, *rchild;PointerTag ltag;PointerTag rtag;} BiThrNode,*BiThrTree;BiThrTree pre;         // 全局变量,始终指向刚刚访问过的结点(若指针p指向当前正在访问的节点,则pre为其前驱节点(即p刚访问完的节点) ) BiThrTree  CreateBiThrTree(BiThrTree T){char c;scanf("%c", &c);if('#' == c ){ return NULL;}else{    T = (BiThrNode *)malloc(sizeof(BiThrNode));T->data = c;T->ltag = Link;  T->rtag = Thread;T->lchild = T->rchild = NULL;printf("%c'lchild is:\n",T->data);getchar();T->lchild = CreateBiThrTree(T->lchild);printf("%c'rchild is:\n",T->data) ;getchar();T->rchild = CreateBiThrTree(T->rchild);}return T;}// 中序遍历_线索化二叉树  void InThreading(BiThrTree T){if(T){InThreading( T->lchild );    // 递归左孩子线索化if(!T->lchild )                   // 如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。{T->ltag = Thread;T->lchild = pre;}if(!pre->rchild ){pre->rtag = Thread;pre->rchild = T;}pre = T;InThreading( T->rchild );// 递归右孩子线索化}}/*中序线索化*/void InOrderThreading(BiThrTree &p,BiThrTree T){   p = (BiThrTree)malloc(sizeof(BiThrNode));/*头节点初始化*/ p->ltag = Link;  p->rtag = Thread;p->rchild = p;            //右指针回旋        if(!T){p->lchild = p;       //左指针回旋 }else{p->lchild = T;pre = p;InThreading(T);    //中序化 /* 处理最后一个节点*/pre->rchild = p;pre->rtag = Thread; p->rchild = pre;}}void visit(char c){printf("%c ", c);}// 中序遍历二叉树void InOrderTraverse(BiThrTree T ){BiThrTree p;p = T->lchild;    //访问根节点 while(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;}}int main(){BiThrTree P, T;printf("Root’s is:\n");T = CreateBiThrTree(T);InOrderThreading(P,T);printf("Inorder is-----\n");InOrderTraverse(P);printf("\n");return 0;}

原创粉丝点击