创建一个二叉树,对该树线索化,对该树线索化遍历
2007-08-01 22:29
363 查看
//首先创建一个二叉树,对该树线索化,对该树线索化遍历
#include<stdio.h>
#include<malloc.h>
#define ElemType char
typedef enum tag{link,thread};
typedef struct threadtree
{
ElemType data;
struct threadtree *lchild,*rchild;
tag ltag,rtag;
}threadtree,*sthreadtree;
//全局变量
sthreadtree pre;
//建立二叉树,类似先序遍历
void creat(sthreadtree &t)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
t=NULL;
else
{
t=(sthreadtree)malloc(sizeof(threadtree));
t->data=ch;
t->ltag=link;t->rtag=link;
creat(t->lchild);
creat(t->rchild);
}
}
//中序遍历
void mid(sthreadtree t)
{
if(t)
{
mid(t->lchild);
printf("%c",t->data);
mid(t->rchild);
}
}
//线索化二叉树,类似中序遍历
void InThread(sthreadtree t)
{
if(t)
{
InThread(t->lchild);
if(!t->lchild) {t->ltag=thread;t->lchild=pre;}
if(!pre->rchild) {pre->rtag=thread;pre->rchild=t;}
pre=t;
InThread(t->rchild);
}
}
//添加一个头结点
void InorderThread(sthreadtree &head,sthreadtree t)
{
//sthreadtree pre;
head=(sthreadtree)malloc(sizeof(threadtree));
head->ltag=link;head->rtag=thread;
head->rchild=head;
if(!t) head->lchild=head;
else
{
head->lchild=t;pre=head;
InThread(t);
pre->rchild=head;pre->rtag=thread;
head->rchild=pre;
}
}
//线索化遍历二叉树
void InOrderTraverse(sthreadtree t)
{
sthreadtree p;
p=t->lchild;
while(p!=t)
{
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);
}
p=p->rchild;
}
}
void main()
{
sthreadtree t=NULL;
sthreadtree T=NULL;//head
printf("请输入要建立树的序列:/n");
creat(t);//mid(t);printf("/n");
InorderThread(T,t);
InOrderTraverse(T);
printf("/n");
}
/*
请输入要建立树的序列:
HDA##C#B##GF#E###
ADCBHFEG
Press any key to continue
*/
#include<stdio.h>
#include<malloc.h>
#define ElemType char
typedef enum tag{link,thread};
typedef struct threadtree
{
ElemType data;
struct threadtree *lchild,*rchild;
tag ltag,rtag;
}threadtree,*sthreadtree;
//全局变量
sthreadtree pre;
//建立二叉树,类似先序遍历
void creat(sthreadtree &t)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
t=NULL;
else
{
t=(sthreadtree)malloc(sizeof(threadtree));
t->data=ch;
t->ltag=link;t->rtag=link;
creat(t->lchild);
creat(t->rchild);
}
}
//中序遍历
void mid(sthreadtree t)
{
if(t)
{
mid(t->lchild);
printf("%c",t->data);
mid(t->rchild);
}
}
//线索化二叉树,类似中序遍历
void InThread(sthreadtree t)
{
if(t)
{
InThread(t->lchild);
if(!t->lchild) {t->ltag=thread;t->lchild=pre;}
if(!pre->rchild) {pre->rtag=thread;pre->rchild=t;}
pre=t;
InThread(t->rchild);
}
}
//添加一个头结点
void InorderThread(sthreadtree &head,sthreadtree t)
{
//sthreadtree pre;
head=(sthreadtree)malloc(sizeof(threadtree));
head->ltag=link;head->rtag=thread;
head->rchild=head;
if(!t) head->lchild=head;
else
{
head->lchild=t;pre=head;
InThread(t);
pre->rchild=head;pre->rtag=thread;
head->rchild=pre;
}
}
//线索化遍历二叉树
void InOrderTraverse(sthreadtree t)
{
sthreadtree p;
p=t->lchild;
while(p!=t)
{
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);
}
p=p->rchild;
}
}
void main()
{
sthreadtree t=NULL;
sthreadtree T=NULL;//head
printf("请输入要建立树的序列:/n");
creat(t);//mid(t);printf("/n");
InorderThread(T,t);
InOrderTraverse(T);
printf("/n");
}
/*
请输入要建立树的序列:
HDA##C#B##GF#E###
ADCBHFEG
Press any key to continue
*/
相关文章推荐
- 数据结构(十二) 二叉树的基本操作 --- 创建一个二叉树 前中后序遍历二叉树
- 创建一个二叉树(先序遍历、中序遍历、后序遍历)
- 一个关于二叉树的创建、先序遍历、中序遍历、后序遍历、求叶子节点的完整函数的c语言完整程序。
- 二叉树的创建,遍历,查找,查找父节点,深度,大小等的递归实现
- 从前序遍历数组创建二叉树 c实现
- USTC——从文件中读入一个二叉树,然后后序遍历该二叉树。
- 二叉树的创建与遍历
- 二叉树的线索化和遍历
- 二叉树遍历(包括先序创建二叉树,递归非递归三种遍历)源码
- 算法实验-二叉树的创建和前序-中序-后序-层次 遍历
- java 创建二叉树 前序、中序、后续 递归遍历树 和 非递归遍历,递归求树高,递归求树节点数
- 二叉树的创建和遍历
- 二叉树:树的创建和遍历
- 二叉树的创建与遍历
- 一个程序理解java二叉树-创建、递归非递归便利、获取路径
- 二叉树创建、遍历、求深度--C语言实现
- 二叉树的创建、前序遍历、中序遍历、后序遍历
- 【数据结构】二叉树的递归与非递归创建和遍历
- 二叉树的创建与遍历
- 数据结构与算法分析学习笔记--第四章(二叉树:创建、递归遍历、非递归遍历、根据数据删除结点等)