线索二叉树的先序创建和遍历

sad19910611 2011-12-13 02:40:35
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef enum{Pointer,Thread}Pointtype;
typedef struct node
{
ElemType data; //数据元素
struct node *lchild; //指向左孩子结点
struct node *rchild; //指向右孩子结点
Pointtype ltag,rtag;
}BTNode;

void CreateBTNode(BTNode * &b,char *str)
{
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; //建立的二叉树初始时为空
ch=str[j];
while (ch!='\0') //str未扫描完时循环
{
switch(ch)
{
case '(':top++;St[top]=p;k=1; break; //为左孩子结点
case ')':top--;break;
case ',':k=2; break; //为孩子结点右结点
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL) //*p为二叉树的根结点
b=p;
else //已建立二叉树根结点
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}

BTNode *pre=NULL;
void Pre_Thread(BTNode *b) //先序线索化递归算法
{
if(b!=NULL)
{
if(NULL!=b->lchild)
b->ltag=Pointer;
else
b->ltag=Thread;
if(NULL!=b->rchild)
b->rtag=Pointer;
else
b->rtag=Thread;
if(NULL!=pre)
{
if(Thread==pre->rtag)
pre->rchild=b;
if(Thread==b->ltag)
b->lchild=pre;
}
pre=b;
Pre_Thread(b->lchild);
Pre_Thread(b->rchild);
}
}

void Inorder_Thread(BTNode *b) //中序线索化递归算法
{
if(NULL!=b)
{
Inorder_Thread(b->lchild);
if(NULL!=b->lchild)
b->ltag=Pointer;
else
b->ltag=Thread;
if(NULL!=b->rchild)
b->rtag=Pointer;
else
b->rtag=Thread;
if(NULL!=pre)
{
if(Thread==pre->rtag)
pre->rchild=b;
if(Thread==b->rtag)
b->rchild=pre;
}
pre=b;
Inorder_Thread(b->rchild);
}
}

void Post_Thread(BTNode *b) //后序线索递归算法
{
if(NULL!=b)
{
Post_Thread(b->lchild);
Post_Thread(b->rchild);
if(NULL!=b->lchild)
b->ltag=Pointer;
else
b->ltag=Thread;
if(NULL!=b->rchild)
b->rtag=Pointer;
else
b->rtag=Thread;
if(NULL!=pre)
{
if(Thread==pre->rtag)
pre->rchild=b;
if(Thread==b->ltag)
b->lchild=pre;
}
pre=b;
}
}



void PreOrder(BTNode *b) //先序线索遍历递归函数
{
BTNode *p=b;
while(NULL!=p)
{
printf("%c",p->data);
if(Pointer==p->ltag)
p=p->lchild;
else
p=p->rchild;
}
printf("\n");
}


/*void InOrder(BTNode *b) //中序遍历递归函数
{
if(b!=NULL)
{
InOrder(b->lchild);
printf("%c",b->data);
InOrder(b->rchild);
}
}

void PostOrder(BTNode *b) //后序遍历递归函数
{
if(b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c",b->data);
}
}*/

void main()
{
BTNode *b,*w;
int i=0;
char a[MaxSize];
char c;
printf("请输入你所创建的树(以#结尾):\n");
while(c!='#')
{
scanf("%c",&c);
a[i]=c;
i++;
}
CreateBTNode(b,a);
printf("先序遍历序列:");
PreOrder(b);
/*printf("\n中序遍历序列:");
InOrder(b);
printf("\n后序遍历序列:");
PostOrder(b);*/
printf("\n");

}


这是先序线索二叉树的创建和遍历,但输出不对,请大神赐教!!!






...全文
384 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧