论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

线索二叉树算法

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:45:18

#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>
typedef char DataType;/*定义DataType类型*/
typedef enum {Link,Thread}PointerTag;
typedef struct node{
 DataType data;
 struct node *lchild, *rchild;/*左右孩子子树*/
 PointerTag LTag,RTag;
}BiThrNode; /*结点类型*/
typedef BiThrNode *BiThrTree ;/*二叉树类型*/
void  CreatBinTree(BiThrTree *T)
{ /*构造二叉链表,注重:输入序列是先序序列*/
 char ch;
 if ((ch=getchar())==' ')
  *T=NULL;
 else{ /*读入非空格*/
  *T=(BiThrNode *)malloc(sizeof(BiThrNode));/*生成结点*/
 (*T)->data=ch;(*T)->LTag=Link;(*T)->RTag=Link;
 CreatBinTree(&(*T)->lchild); /*构造左子树    */
 CreatBinTree(&(*T)->rchild); /*构造右子树*/
 }
}
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);/*右子树线索化*/
 }
}
int InOrderThreading(BiThrTree *Thrt,BiThrTree T)
                                  /*中序遍厉二叉树T,并将其中序线索化,Thrt指向头结点*/
{ if(!(*Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0);
  (*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 1;
}
int print(BiThrTree e)
{printf("%d  %c  %d\n",e->LTag,e->data,e->RTag);return 1;}

int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e))
                                  /*T指向头结点,头结点的左链lchild指向根结点,中序遍厉二叉树*/
{BiThrTree p;
 p=T->lchild;/*p指向根结点*/
 while(p!=T)/*空树或遍厉结束时,p==T*/
 {while(p->LTag==Link) p=p->lchild;
  if(!visit(p)) return 0;/*打印*/
  while(p->RTag==Thread&&p->rchild!=T)
  {p=p->rchild;visit(p);}/*访问后继结点*/
  p=p->rchild;
 }
 return 1;
}
void main()
{ /*测试程序*/
 BiThrTree T,Thrt;
 CreatBinTree(&T);
    InOrderThreading(&Thrt,T);
    InOrderTraverse(Thrt,print);
}
/*可输入"-+a  *b  -c  d  /e  f  "来测试(注重空格)*/

上一篇:{应用}用栈设置密码 人气:5387
下一篇:{应用}利用栈来实现单链表的逆序 人气:6260
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058