(原创)中序线索化二叉树
2007-08-22 18:00
232 查看
根据严蔚敏教材第135页算法6.6和6.7而来,可在VC下运行。
#include <stdio.h>
#include <process.h>
#include <stdarg.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
#define MAXNODE 100
#define OVERFLOW -2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR -1
//#define Link 0
//#define Thread 1
typedef char TElemType;
typedef int Status;
typedef enum PointerTag {Link,Thread};//Link==0;指针,Thread==1;线索
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
} BiThrNode,*BiThrTree;
BiThrTree Pre;//全局变量
Status PrintElement(TElemType e)
{
printf("_%c_",e);return OK;
}//PrintElement
Status NewTree(BiThrTree &T)
{
T=(BiThrNode *)malloc(sizeof(BiThrNode));
T->data='#';
T->LTag=Link;T->RTag=Link;
T->lchild=NULL;T->rchild=NULL;
return OK;
}//NewTree
Status CreateBiTree(BiThrTree &T)
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
T->data=ch;
T->LTag=Link;T->RTag=Link;
printf("Create BiThrNode succeed at %c ",T->data);
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}//CreateBiThrTree
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;
InThreading(p->rchild);
}
}//InThreading
Status InOrderTraverseThreading(BiThrTree &Thrt,BiThrTree T)
{
if(!(Thrt=(BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
Thrt->LTag=Link;Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T)
Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;Pre=Thrt;
InThreading(T);
Pre->rchild=Thrt;Pre->RTag=Thread;
Thrt->rchild=Pre;
}
return OK;
}//InOrderTraverseThreading
Status InOrderTraverse(BiThrTree T,Status(*Visit)(TElemType e))
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link) p=p->lchild;
if(!Visit(p->data)) return ERROR;
while((p->RTag==Thread)&&(p->rchild!=T))
{
p=p->rchild;Visit(p->data);
}
p=p->rchild;
}
return OK;
}//InOrderTraverse
int main()
{
BiThrTree S,T;
NewTree(T);
CreateBiTree(T);printf("CreateBiTree Complete ");
// InOrderTraverse(T,PrintElement);
InOrderTraverseThreading(S,T);
InOrderTraverse(S,PrintElement);
return 1;
}
/*运行结果:输入
-+a##*b##-c##d##/e##f##
Create BiThrNode succeed at -
Create BiThrNode succeed at +
Create BiThrNode succeed at a
Create BiThrNode succeed at *
Create BiThrNode succeed at b
Create BiThrNode succeed at -
Create BiThrNode succeed at c
Create BiThrNode succeed at d
Create BiThrNode succeed at /
Create BiThrNode succeed at e
Create BiThrNode succeed at f
CreateBiTree Complete
_a__+__b__*__c__-__d__-__e__/__f_Press any key to continue*/
#include <stdio.h>
#include <process.h>
#include <stdarg.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
#define MAXNODE 100
#define OVERFLOW -2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR -1
//#define Link 0
//#define Thread 1
typedef char TElemType;
typedef int Status;
typedef enum PointerTag {Link,Thread};//Link==0;指针,Thread==1;线索
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
} BiThrNode,*BiThrTree;
BiThrTree Pre;//全局变量
Status PrintElement(TElemType e)
{
printf("_%c_",e);return OK;
}//PrintElement
Status NewTree(BiThrTree &T)
{
T=(BiThrNode *)malloc(sizeof(BiThrNode));
T->data='#';
T->LTag=Link;T->RTag=Link;
T->lchild=NULL;T->rchild=NULL;
return OK;
}//NewTree
Status CreateBiTree(BiThrTree &T)
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
T->data=ch;
T->LTag=Link;T->RTag=Link;
printf("Create BiThrNode succeed at %c ",T->data);
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}//CreateBiThrTree
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;
InThreading(p->rchild);
}
}//InThreading
Status InOrderTraverseThreading(BiThrTree &Thrt,BiThrTree T)
{
if(!(Thrt=(BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
Thrt->LTag=Link;Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T)
Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;Pre=Thrt;
InThreading(T);
Pre->rchild=Thrt;Pre->RTag=Thread;
Thrt->rchild=Pre;
}
return OK;
}//InOrderTraverseThreading
Status InOrderTraverse(BiThrTree T,Status(*Visit)(TElemType e))
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link) p=p->lchild;
if(!Visit(p->data)) return ERROR;
while((p->RTag==Thread)&&(p->rchild!=T))
{
p=p->rchild;Visit(p->data);
}
p=p->rchild;
}
return OK;
}//InOrderTraverse
int main()
{
BiThrTree S,T;
NewTree(T);
CreateBiTree(T);printf("CreateBiTree Complete ");
// InOrderTraverse(T,PrintElement);
InOrderTraverseThreading(S,T);
InOrderTraverse(S,PrintElement);
return 1;
}
/*运行结果:输入
-+a##*b##-c##d##/e##f##
Create BiThrNode succeed at -
Create BiThrNode succeed at +
Create BiThrNode succeed at a
Create BiThrNode succeed at *
Create BiThrNode succeed at b
Create BiThrNode succeed at -
Create BiThrNode succeed at c
Create BiThrNode succeed at d
Create BiThrNode succeed at /
Create BiThrNode succeed at e
Create BiThrNode succeed at f
CreateBiTree Complete
_a__+__b__*__c__-__d__-__e__/__f_Press any key to continue*/
相关文章推荐
- 第十一周--线索化二叉树(中序)
- 二叉树算法验证(3)中序线索化二叉树的算法验证
- 第11周 项目1-验证算法(3)线索化二叉树(中序)
- 第十一周项目1—验证算法(3)中序线索化二叉树的算法验证
- 【第11周 项目1 - 二叉树算法验证(3)中序线索化二叉树的算法验证】
- 第11周项目1 验证算法(3)中序线索化二叉树的算法验证
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第十一周 中序线索化二叉树的算法验证
- 第十一周--中序线索化二叉树的算法验证
- 第十一周 项目1-验证算法(3)中序线索化二叉树的算法
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第十周项目1(3)---中序线索化二叉树的算法验证
- 第10周项目1(3)-中序线索化二叉树的算法验证
- 第十周项目一 验证算法(3)中序线索化二叉树的算法验证
- 第十一周项目1-(3)中序线索化二叉树的算法
- 中序线索化二叉树
- 【算法与数据结构】二叉树 中序线索
- 中序线索化二叉树
- YTU 3026: 中序线索化二叉树