对如图所示的二叉树建立中序线索二叉树,并遍历
#include <cstdio>
#include <cstdlib>
typedef struct Node{
char data;
Node *lchild, *rchild;
int lflag, rflag;
}Node, *BiTree;
Node* newNode(char v){
BiTree node = (BiTree)malloc(sizeof(BiTree));
node->data = v;
node->lchild = NULL;
node->rchild = NULL;
node->lflag = 0;
node->rflag = 0;
return node;
}
void init(BiTree &T){
T = newNode('A');
T->lchild = newNode('B'), T->rchild = newNode('C');
T->lchild->lchild = newNode('D'), T->lchild->rchild = newNode('E'), T->rchild->rchild = newNode('G');
}
void preorder(BiTree T){
if(T == NULL) return;
printf("%c", T->data);
preorder(T->lchild);
preorder(T->rchild);
}
void inorder(BiTree T){
if(T == NULL) return;
inorder(T->lchild);
printf("%c", T->data);
inorder(T->rchild);
}
void postorder(BiTree T){
if(T == NULL) return;
postorder(T->lchild);
postorder(T->rchild);
printf("%c", T->data);
}
void InThread(BiTree &T, BiTree &pre){
if(T != NULL){
InThread(T->lchild, pre);
if(T->lchild == NULL){
T->lchild = pre;
T->lflag = 1;
}
if(pre!=NULL && pre->rchild==NULL){
pre->rchild = T;
pre->rflag = 1;
}
pre = T;
InThread(T->rchild, pre);
}
}
void createInThread(BiTree &T){
if(T != NULL){
BiTree pre = NULL;
InThread(T, pre);
pre->rchild = NULL;
pre->rflag = 1;
}
}
Node* FirstNode(Node* p){
while(p->lflag == 0){
p = p->lchild;
}
return p;
}
Node* NextNode(Node* p){
if(p->rflag==1){
return p->rchild;
}else{
return FirstNode(p->rchild);
}
}
void Inorder(BiTree T){
for(Node* p=FirstNode(T); p!=NULL; p=NextNode(p)){
printf("%c", p->data);
}
}
int main(){
BiTree T;
init(T);
createInThread(T);
Inorder(T);
return 0;
}
运行结果