线索二叉树的建立与遍历

来源:互联网 发布:ubuntu提取dsdt办法 编辑:程序博客网 时间:2024/05/17 21:07

线索二叉树的建立与遍历

#include<stdio.h>

#include<stdlib.h>

typedef enum PointerTag{Link, Thread};

typedef struct BiThrNode{

char 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;

InThreading(p->rchild);

}

void BiTree_Thread(BiThrTree bt,BiThrTree &Thrt){

//中序线索化

Thrt=(BiThrTree)malloc(sizeof(BiThrNode));

Thrt->Ltag=Link; Thrt->Rtag=Thread;

Thrt->rchild=Thrt;

if(!bt){

Thrt->Ltag=Thread; Thrt->lchild=Thrt;

else{

Thrt->lchild=bt; pre=Thrt;

InThreading(bt);

pre->Rtag=Thread; pre->rchild=Thrt;

Thrt->rchild=pre;

}

}

void visit(char ch){

printf("%3c",ch);

void InOrderTravrese_Thrt(BiThrTree Thrt){

//中序遍历

BiThrTree p;

p=Thrt->lchild;

while(p!=Thrt){

while(p->Ltag==Link){

p=p->lchild;

}

visit(p->data);

while(p->Rtag==Thread&&p->rchild!=Thrt){

p=p->rchild;

visit(p->data);

}

p=p->rchild;

}

}

void CreatBiTree(BiThrTree &bt){

//构造二叉树

char ch;

ch=getchar();

if(ch=='#')

bt=NULL;

else{

bt=(BiThrTree)malloc(sizeof(BiThrNode));

bt->data=ch;

CreatBiTree(bt->lchild);

CreatBiTree(bt->rchild);

int main(){

BiThrTree bt;

BiThrTree Thrt;

printf("输入数据:\n");

CreatBiTree(bt);

BiTree_Thread(bt,Thrt);

InOrderTravrese_Thrt(Thrt);

return 0;

}


原创粉丝点击