线索二叉树算法,第1张

线索二叉树算法,第2张

# include
# include
# include
typedef char数据类型;/*定义数据类型type */
Typedefenum {link,thread}指针标记;
typedef结构节点{
数据类型数据;
结构节点*lchild,* rchild/*左右子子树*/
PointerTag LTag,RTag
} BiThrNode;/*节点类型*/
typedef bithrnode * bithrtree;/*二叉树类型*/
void creat Bintree(Bithrtree * t)
{/*构造一个二叉链表。注意:输入序列是一个预先排序的序列*/
char ch;
if((ch = getchar())= = ' ')
* T = NULL;
else{ /*读入非空case */
* t =(bithrnode *)malloc(sizeof(bithrnode));/*生成节点*/
(* T)-> data = ch;(* T)-> LTag = Link;(* T)-> RTag = Link;
creat bintree(&(* T)-> l child);/*构造左子树*/
creat bintree(&(* t)-> rchild);/*构造右子树*/
}
}
比思RTree Pre/*全局变量*/
线程中的void(bithrtree p)
{
if(p)
{线程中(p-> l child);/*包含左子树*/
if(!p-> l child){ p-> LTag = Thread;p-> l child = pre;}/*前兆线索*/
if(!pre-> rchild){ pre-> RTag = Thread;pre-> rchild = p;}/*后续线索*/
pre = p;/*保持pre指向p */
in threading(p-> rchild);/*线程右边子树*/
}
}
int按顺序线程化(比思RTree * Thrt,比思RTree T)
/*并线程化二叉树T的中间顺序,Thrt指向头节点*/
。(* Thrt =(BiThrTree)malloc(sizeof(BiThrNode))))exit(0);
(* Thrt)-> LTag = Link;(* Thrt)-> RTag = Thread;/*构建第一个节点*/
(* Thrt)-> rchild = * Thrt;/*右指针指回*/
if(!t)(* Thrt)-> l child = * Thrt;
else
{(* Thrt)-> l child = T;pre = * Thrt
in threading(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);返回1;}

Int顺序遍历(比思树t,int (* visit)(比思树e))
/* t指向头节点,头节点的左链lchild指向根节点,中序二叉树*/
{比思树p;
p = T-> l child;/*p指向根节点*/
而(p!=T)/*空在树或pass的末尾,p = = T */
{ while(p-> ltag = = link)p = p-> l child;
如果(!visit(p))返回0;/* print */
while(p-> rtag = = thread & & p-> rchild!= T)
{ p = p-> rchild;访问(p);}/*访问后继节点*/
p = p-> rchild;
}
return 1;
}
void main()
{/*测试程序*/
BiThrTree T,Thrt
creat bintree(& T);
InOrderThreading(&Thrt,T);
InOrderTraverse(Thrt,print);
}
/*可以输入“-+a *b -c d /e f”进行测试(note 空) */

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 线索二叉树算法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情