您的位置:首页 > 其它

中序线索化二叉树

2014-05-05 22:42 351 查看
这个代码其实自己花了很长的时间去理解,渐渐的有所明白了一点。

#include <stdio.h>
#include <stdlib.h>

typedef  enum { Link , Thread } PointTag;    //Link表示指针,Thread表示线索

typedef struct treenode                                //树的节点定义
{
int data ;
struct treenode * leftchild , * rightchild ;
PointTag leftTag , rightTag ;
} TreeNode ;

TreeNode * CreactTree()                         //建立树
{
TreeNode * T ;
int data ;
scanf("%d" , & data);

if(0 == data)
{
T = NULL ;
}
else
{
T = (TreeNode *)malloc(sizeof(TreeNode)) ;
T->data = data ;
T->leftchild = CreactTree() ;
T->rightchild = CreactTree() ;
}

return(T) ;
}

void InThreading(TreeNode * T,TreeNode **pre)     //中序遍历线索化
{
TreeNode * p ;
p = T ;

if(NULL != p)
{
InThreading(p->leftchild,pre) ;

if(NULL == p->leftchild)
{
p->leftchild =(*pre);
p->leftTag = Thread ;
}
else
{
p->leftTag = Link ;
}

if(NULL == (*pre)->rightchild)
{
(*pre)->rightchild = p ;
(*pre)->rightTag = Thread ;
}
else
{
(*pre)->rightTag = Link ;
}

(*pre) = p ;
InThreading(p->rightchild,pre) ;
}
}

TreeNode * InOrdetThreading(TreeNode * T)      //中序线索化二叉树
{
TreeNode * Thrt , * * pre;
pre = (TreeNode * *)malloc(sizeof(TreeNode *)) ;  //用来传递前一个位置指针
(* pre) = (TreeNode *)malloc(sizeof(TreeNode)) ;
Thrt = (TreeNode *)malloc(sizeof(TreeNode)) ;  // 建立一个新的头节点
Thrt->leftchild = T ;
Thrt->rightchild = Thrt ;
(*pre) = Thrt ;
InThreading(T,pre) ;      //中序遍历并线索化
(*pre)->rightchild = Thrt ;
(*pre)->rightTag = Thread ;
Thrt->rightchild =(*pre) ;
return(Thrt) ;
}

void InTravel(TreeNode * Thrt)
{
TreeNode * p ;
p = Thrt->leftchild ;

while(p != Thrt)
{
while(Link == p->leftTag)
p = p->leftchild ;

printf("%d    " , p->data) ;

while(Thread == p->rightTag && Thrt != p->rightchild)
{
p = p->rightchild ;
printf("%d    " , p->data) ;
}

p = p->rightchild ;
}
}

int main()
{
TreeNode * T , * Thrt ;
T = CreactTree() ;
Thrt = InOrdetThreading(T) ;
InTravel(Thrt) ;
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: