📄 线索二叉树thread.cpp
字号:
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data;
int ltag,rtag;
struct node *lchild;
struct node *rchild;
} TBTNode;
void CreateTBTNode(TBTNode * &b,char *str)
{
TBTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while (ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1; break;
case ')':top--;break;
case ',':k=2; break;
default:p=(TBTNode *)malloc(sizeof(TBTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL)
b=p;
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
TBTNode *pre;
void Thread(TBTNode *&p)
{
if (p!=NULL)
{
Thread(p->lchild);
if (p->lchild==NULL)
{
p->lchild=pre;
p->ltag=1;
}
else p->ltag=0;
if (pre->rchild==NULL)
{
pre->rchild=p;
pre->rtag=1;
}
else pre->rtag=0;
pre=p;
Thread(p->rchild);
}
}
TBTNode *CreaThread(TBTNode *b) /*中序线索化二叉树*/
{
TBTNode *root;
root=(TBTNode *)malloc(sizeof(TBTNode));
root->ltag=0;root->rtag=1;
root->rchild=b;
if (b==NULL)
root->lchild=root;
else
{
root->lchild=b;
pre=root;
Thread(b);
pre->rchild=root;
pre->rtag=1;
root->rchild=pre;
}
return root;
}
char disp[10];
int k;
void ThInOrder(TBTNode *tb)
{
TBTNode *p=tb->lchild;
while (p!=tb)
{
while (p->ltag==0)
p=p->lchild;
disp[k]=p->data;k++;
while (p->rtag==1 && p->rchild!=tb)
{
p=p->rchild;
disp[k]=p->data;k++;
}
p=p->rchild;
}
}
void main()
{
TBTNode *b,*tb;
CreateTBTNode(b,"A(B(D(,G)),C(E,F))");
tb=CreaThread(b);
k=0;
ThInOrder(tb);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -