#include "stdio.h"
#include "stdlib.h" #define OK 1
#define ERROR 0 typedef char TElemType;
typedef char Elemtype;
typedef int Status;
typedef enum PointerTag {Link,Thread}; //link==0:pointer,Thread==1:thread
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree; BiThrTree pre; // 全局变量,始终指向刚刚访问过的结点 void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);//左子树线索化
if(!p->lchild){p->LTag=Thread;p->lchild=pre;}//前驱线索
if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}//后续线索
pre=p; //保持pre指向p的前驱
InThreading(p->rchild);//右子树线索化
}//if
}//InThreading Status InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
//中序遍历二叉树,并将其中序线索化,Thrt指向头结点
//BiThrTree Thrt;
if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(-1);
Thrt->LTag=Link; //建立头结点
Thrt->RTag=Thread; //右指针回指
Thrt->rchild=Thrt;
if(!T) Thrt->rchild=Thrt; //若二叉树为空,则左指针回指
else {
Thrt->lchild=T;
pre=Thrt;
InThreading(T); //中序遍历进行中序线索化
pre->rchild=Thrt;//最后一个结点线索化
pre->RTag=Thread;
Thrt->rchild=pre;
}
return OK;
}//InOrderThreading Status InOrderTraverse_Thr(BiThrTree T)
{
//T指向头结点,头结点的左链lchild指向根结点,非递归算法
BiThrTree p;
p=T->lchild;
while(p!=T) //空树或遍历结束时,T==p
{
while(p->LTag==Link) p=p->lchild;
printf("%c",p->data); //访问其左子树为空的结点
while(p->RTag==Thread&&p->rchild!=T)
{
p=p->rchild;
printf("%c",p->data); //访问后续结点
}//while
p=p->rchild;
}//while
printf("\n");
return OK;
}//InOrderT_Thr BiThrTree InOrderSearch_Thr(BiThrTree T,Elemtype ch)
{
//T指向头结点,头结点的左链lchild指向根结点,非递归算法,查找指定字符ch,找到返回,未找到返回NULL
BiThrTree p;
p=T->lchild;
while(p!=T) //空树或遍历结束时,T==p
{
while(p->LTag==Link) p=p->lchild;
if(p->data==ch) return p; //找到,返回该结点指针
while(p->RTag==Thread&&p->rchild!=T)
{
p=p->rchild;
if(p->data==ch) return p; //找到,返回该结点指针
}//while
p=p->rchild;
}//while
return NULL;
}//InOrderT_Thr Status CreateBitree(BiThrTree &T)
{//按先序次序输入二叉树
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else{
if(!(T=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(1);
T->data=ch;T->LTag=Link;T->RTag=Link;
CreateBitree(T->lchild);
CreateBitree(T->rchild);
}//else
return OK;
}//CreateBitree Status printelemt(Elemtype e)
{
printf("%c",e);
return OK;
} Status preordertraverse(BiThrTree t,Status (*visit)(Elemtype e))
{
if(t)
{
if(visit(t->data))
if(preordertraverse(t->lchild,visit))
if(preordertraverse(t->rchild,visit)) return OK;
return ERROR;
}
else
return OK;
} Status inordertraverse(BiThrTree t,Status (*visit)(Elemtype e))
{
if(t)
{
if(inordertraverse(t->lchild,visit))
if(visit(t->data))
if(inordertraverse(t->rchild,visit)) return OK;
return ERROR;
}
else
return OK;
} Status postordertraverse(BiThrTree t,Status (*visit)(Elemtype e))
{
if(t)
{
if(postordertraverse(t->lchild,visit))
if(postordertraverse(t->rchild,visit))
if(visit(t->data)) return OK;
return ERROR;
}
else
return OK;
} BiThrTree InNext(BiThrTree p)
/*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/
{
BiThrTree Next;
BiThrTree q;
if (p->RTag==1)
Next = p->rchild;
else
{
if(p->rchild!=NULL)
{
for(q=p->rchild; q->LTag==0 ;q=q->lchild);
Next=q;
}
else
Next = NULL;
}
return(Next);
} BiThrTree InPre(BiThrTree p)
/* 在中序线索二叉树中查找p的中序前驱, 并用pre指针返回结果 */
{
BiThrTree q;
if(p->LTag==1)
pre = p->lchild;
else
{
for(q = p->lchild;q->RTag==0;q=q->rchild);
pre=q;
}
return(pre);
} int main()
{
char ch;
BiThrTree T,Thrt,p,q;
CreateBitree(T);//创建
preordertraverse(T,printelemt);
printf("\n");
inordertraverse(T,printelemt);
printf("\n");
postordertraverse(T,printelemt);
printf("\n");
InOrderThreading(Thrt,T);//线索化
printf("中序遍历该线索二叉树得到的序列为:\n");
InOrderTraverse_Thr(Thrt);//遍历访问
getchar();
printf("请输入树中的一个字符");
scanf("%c",&ch); p=InOrderSearch_Thr(T,ch);
q=InNext(p);
printf("后继结点:%c\n",q->data);
q=InPre(p);
printf("先趋结点:%c\n",q->data);
return OK;
}

bithrtree的更多相关文章

  1. 二叉树的创建和遍历(C版和java版)

    以这颗树为例:#表示空节点前序遍历(根->左->右)为:ABD##E##C#F## 中序遍历(左->根->右)为:#D#B#E#A#C#F# 后序遍历(左->右-> ...

  2. Tree

    //Header.h #ifndef _HEAD_ #define _HEAD_ #include <queue> #include <iostream> using name ...

  3. (原创)Python文件与文件系统系列(5)——stat模块

    stat模块中定义了许多的常量和函数,可以帮助解释 os.stat().os.fstat().os.lstat()等函数返回的 st_result 类型的对象. 通常使用 os.path.is*() ...

  4. Data Structure 之 二叉树

          在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆 ...

  5. 线索二叉树Threaded binary tree

    摘要   按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列.在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结点.这 ...

  6. 数据结构中,几种树的结构表示方法(C语言实现)

    //***************************************** //树的多种结构定义 //***************************************** # ...

  7. 树和二叉树->线索二叉树

    文字描述 从二叉树的遍历可知,遍历二叉树的输出结果可看成一个线性队列,使得每个结点(除第一个和最后一个外)在这个线形队列中有且仅有一个前驱和一个后继.但是当采用二叉链表作为二叉树的存储结构时,只能得到 ...

  8. 【Java】 大话数据结构(9) 树(二叉树、线索二叉树)

    本文根据<大话数据结构>一书,对Java版的二叉树.线索二叉树进行了一定程度的实现. 另: 二叉排序树(二叉搜索树) 平衡二叉树(AVL树) 二叉树的性质 性质1:二叉树第i层上的结点数目 ...

  9. Chapter 6(树)

    1.树的储存方式 //****************双亲表示法************************ #define Max_TREE_SIZE 100 typedef int TElem ...

随机推荐

  1. 导出你的GAC Assembly中的DLLS

    方法1: CMD命令中,进入C:\windows\assembly,然后XCOPY GAC_MSIL c:\temp /E 这样就得到了dlls了,以命名空间来分类. 如果想将dlls从集合中分出来, ...

  2. Web通信中的Get、Post方法

    首先我们要了解Tomcat,Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. ...

  3. android 利用隐式Intent打开图片

    实现功能   点击"查看图片"时能够跳出提示,选择系统图库打开还是自己编写的应用打开,并且对于下载好的图片也有效. 1.我将 qiaoba.jpg 放在 res/drawable  ...

  4. 不用Google Adsense的84个赚钱方法

    这是一个关于网络广告商和网络销售的汇总列表,可以用来为您的网站或博客赚点钱.广告商都是英文的,加入广告请确认其是否支持中国地区支持,不支持的话就不必加入了. Chitika : 购物中心旗帜广告. ( ...

  5. opencv安装及学习资料

    第一次装时win7+VS2010+opencv3.0,结果不成功,原因解压出来的没有vc10,可能新版本不在支持vc的旧版本了.所以换了VS2013+opencv3.0,比较经典的安装时VS2010+ ...

  6. ROW_NUMBER分页的注意事项

    之前在使用ROW_NUMBER分页获取数据的时候,直接用ROW_NUMBER里的SELECT语句查出了所有的数据. like this: select * from ( select row_numb ...

  7. Oracle IN 传递字符串参数查询失效

    在写存储过程中有如下代码: FOR a IN ( SELECT a.svo_no,a.AUDIT_NO,a.order_id FROM TT_PI_MODEL_REL a ) LOOP SELECT ...

  8. webservice拦截器 查看消息包(soap)

    服务端: 1.获取EndpointImpl对象 2.调用EndpointImpl对象中的方法获取In拦截器 3.调用EndpointImpl对象中的方法获取out拦截器 4.添加自己的In拦截器与Ou ...

  9. Java多线程:Semaphore

    Semaphore为并发包中提供用于控制某资源同时可以被几个线程访问的类 实例代码: // 允许2个线程同时访问 final Semaphore semaphore = new Semaphore(2 ...

  10. WARN [main] conf.HiveConf (HiveConf.java:initialize(1488)) - DEPRECATED

    问题描述:hive 关于告警问题的解决:WARN  [main] conf.HiveConf (HiveConf.java:initialize(1488)) - DEPRECATED: Config ...