线索二叉树

来源:互联网 发布:mac 专卖店 屏幕保护 编辑:程序博客网 时间:2024/06/07 04:44

线索二叉树?什么是线索二叉树呢?一棵二叉树的左右叶子节点,注意是叶子节点,叶子的左结点和右结点一般为空,为了有效地利用其左右结点,我们将左结点指向他的前驱,将右结点指向他的后继!如图:

创建线索二叉树,遍历线索二叉树代码:

#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会进行改变的,将其线索成一个环,看图1pre->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

0 0
原创粉丝点击