标签:
线索二叉树?什么是线索二叉树呢?一棵二叉树的左右叶子节点,注意是叶子节点,叶子的左结点和右结点一般为空,为了有效地利用其左右结点,我们将左结点指向他的前驱,将右结点指向他的后继!如图:
创建线索二叉树,遍历线索二叉树代码:
#include <stdio.h> #include <stdlib.h> typedef char ElemType; //线索存储标志位 //Link(0) 表示指向左右孩子的指针 //Thread(1) 表示指向前驱后继的线索 typedef enum {Link,Thread} PointerTag; typedef struct BiThrNode{ char Data; struct BiThrNode *lchild,*rchild; PointerTag ltag; PointerTag rtag; }BiThrNode,*BiThrTree; //创建一棵二叉树,约定用户遵照前序遍历的方式输入数据 void CreateBiThrTree(BiThrTree *T){ char c; scanf("%c",&c);//用户输入 if(' '==c){ *T=NULL; }else{ *T=(BiThrNode*)malloc(sizeof(BiThrNode)); (*T)->data=c; (*T)->ltag=Link; (*T)->rtag=Link; CreateBiThrTree(&(*T)->lchild);//递归调用 CreateBiThrTree(&(*T)->rchild);//递归调用 } } //中序遍历线索化 BiThrTree pre;//指向前一个访问的结点 InThreading(BiThrTree T){ if(T){ InThreading(T->lchild);//递归左孩子线索化 if(!T->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会进行改变的,将其线索成一个环,看图1 pre->rchild=*p; pre->rtag=Thread; (*p)->rchild=pre; } } void visit(char data){ printf("%c",data); } 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=NULL; CreateBiThrTree(T);//创建二叉树 InorderThreading(&P,T);//线索二叉树 printf("中序遍历线索树:"); InorderTraverse(P); printf("\n"); }
图1
标签:
原文地址:http://blog.csdn.net/mengzhisuoliu/article/details/45040781