线索二叉树(附栈)—创造、前序、对称序周游,寻找指定元素前驱
```javascript
#include <stdio.h>
#include <malloc.h>
struct ThrTreeNode;
typedef struct ThrTreeNode* P_ThrTree;
struct ThrTreeNode{
char data;
P_ThrTree L_link,R_link;
int ltag,rtag;
};
typedef struct ThrTreeNode* ThrTree;
struct SeqStack{
int MAXNUM;
int t;
ThrTree *s;
};
typedef struct SeqStack* PSeqStack;
PSeqStack create_NULL_Stack(int m){
PSeqStack stack = (PSeqStack)malloc(sizeof(struct SeqStack));
if(stack!=NULL)
{
stack->s = (ThrTree*)malloc(sizeof(ThrTree)*m);
if(stack->s)
{
stack->MAXNUM = m;
stack->t = -1;
return stack;
}else{
free(stack);
}
}
printf("创建失败\n");
return NULL;
}
void push_seq(PSeqStack pastack,ThrTree x){
if(pastack->t>=pastack->MAXNUM-1)
{
printf("超出栈存储范围!\n");
return;
}
else
{
pastack->t = pastack->t + 1;
pastack->s[pastack->t] = x;
return;
}
}
void pop_seq(PSeqStack pastack){
if(pastack->t==-1)
{
printf("出栈,栈是空的!\n");
return;
}
else
{
pastack->t = pastack->t - 1;
}
}
ThrTree top_seq(PSeqStack pastack){
if(pastack->t==-1)
{
printf("取栈顶,栈是空的!\n");
}
else
{
return(pastack->s[pastack->t]);
}
}
int isEmptyStack_seq(PSeqStack pastack){
if(pastack->t==-1)
{
return 1;
}
else
{
return 0;
}
}
ThrTree create_ThrTree(P_ThrTree thrTree){
printf("输入该节点的字符:(输入:#返回上一级)\n");
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#')
{
printf("# 返回上一级\n");
return NULL ;
}
else
{
thrTree = (ThrTree)malloc(sizeof(struct ThrTreeNode));
ThrTree Pointer = thrTree;
Pointer->data = ch;
Pointer->ltag = 0;
Pointer->rtag = 0;
Pointer->L_link = NULL;
Pointer->R_link = NULL;
printf("创建<--左子树\n");
Pointer->L_link = create_ThrTree(Pointer->L_link);
printf("创建右子树-->\n");
Pointer->R_link = create_ThrTree(Pointer->R_link);
}
return thrTree;
}
int getHeight_tree(ThrTree thrTree){
int left_height,right_height,theHeight;
if(thrTree!=NULL)
{
left_height = getHeight_tree(thrTree->L_link);
right_height = getHeight_tree(thrTree->R_link);
theHeight = left_height > right_height ? left_height : right_height;
return theHeight+1;
}else{
return 0;
}
}
void thread(ThrTree thrTree){
PSeqStack st = create_NULL_Stack(getHeight_tree(thrTree));
ThrTree p,pr;
p = thrTree;
pr = NULL;
do{
while(p!=NULL)
{
push_seq(st,p);
p = p->L_link;
}
p = top_seq(st);
pop_seq(st);
printf("当前栈定元素的标号为:%d\n",st->t);
if(pr!=NULL)
{
if(pr->R_link==NULL)
{
printf("pr前驱节点:%c,可以修改:右子树(指向后继:%c)\n",pr->data,p->data);
pr->R_link = p;
pr->rtag = 1;
}
if(p->L_link==NULL)
{
printf("p当前节点:%c,可以修改:左子树(指向前驱:%c)\n",p->data,pr->data);
p->L_link = pr;
p->ltag = 1;
}
}
pr = p;
p = p->R_link;
}while(!isEmptyStack_seq(st)||p!=NULL);
}
void preOrder(ThrTree thrTree){
if(thrTree==NULL)
{
return;
}
printf("%c\n",thrTree->data);
printf("-----------------------------");
preOrder(thrTree->L_link);
preOrder(thrTree->R_link);
}
void inOrder(ThrTree thrTree){
ThrTree pointer = thrTree;
if(pointer==NULL)
{
return;
}
while(pointer->L_link!=NULL&&pointer->ltag==0)
{
pointer = pointer->L_link;
}
while(pointer!=NULL)
{
printf("%c",pointer->data);
if(pointer->R_link!=NULL&&pointer->rtag==0)
{
pointer = pointer->R_link;
while(pointer->L_link!=NULL&&pointer->ltag==0)
{
pointer = pointer->L_link;
}
}else{
pointer = pointer->R_link;
}
}
}
void find_Pioneer(ThrTree thrTree,char x){
ThrTree pointer = thrTree;
ThrTree mark;
if(pointer==NULL)
{
return;
}
while(pointer->L_link!=NULL&&pointer->ltag==0)
{
pointer = pointer->L_link;
}
while(pointer!=NULL)
{
if(pointer->data==x&&pointer->ltag==1)
{
printf("前驱为:%c\n",pointer->L_link->data);
}else if(pointer->data==x&&pointer->ltag==0){
printf("前驱为:%c\n",mark->data);
}
if(pointer->R_link!=NULL&&pointer->rtag==0)
{
pointer = pointer->R_link;
while(pointer->L_link!=NULL&&pointer->ltag==0)
{
pointer = pointer->L_link;
}
}else{
mark = pointer;
pointer = pointer->R_link;
}
}
}
int main() {
ThrTree thrTree = create_ThrTree(thrTree);
printf("树创建完成\n");
printf("树高为:%d\n",getHeight_tree(thrTree));
printf("周游树:先根序列\n");
preOrder(thrTree);
thread(thrTree);
printf("线索化完成\n");
printf("周游树:对称序列\n");
inOrder(thrTree);
while(1)
{
printf("输入你想找到其前驱的字符:\n");
getchar();
char x;
scanf("%c",&x);
find_Pioneer(thrTree,x);
}
return 0;
}