线索二叉树:将指向空链域的左指针指向其前驱,右指针指向其后继。
- 通过中序遍历对二叉树线索化的递归算法
- 通过中序遍历建立中序线索化二叉树(含头结点)
- 中序遍历建立中序线索化二叉树(不含头结点)
- 中序遍历二叉线索树的非递归算法
#include<stdio.h>
#include<stdlib.h>
typedef struct ThreadNode{
char data;
struct ThreadNode *lchild;
struct ThreadNode *rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
void CreateBiTree_Thr(ThreadTree &T)
{
char ch;
ch=getchar();
if(ch=='^'){
T=NULL;
}else{
T=(ThreadTree)malloc(sizeof(ThreadTree));
T->data=ch;
CreateBiTree_Thr(T->lchild);
if(T->lchild){
T->ltag=0;
}else{
T->ltag=1;
}
CreateBiTree_Thr(T->rchild);
if(T->rchild){
T->rtag=0;
}else{
T->rtag=1;
}
}
}
//通过中序遍历对二叉树线索化的递归算法
void InThread(ThreadTree &p,ThreadTree &pre){
if(p!=NULL){
InThread(p->lchild,pre);
if(p->lchild==NULL){//左子树为空,建立前驱线索
p->lchild=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=p;//建立前驱结点的后继线索
pre->rtag=1;
}
pre=p;//保持pre指向p的前驱,pre指向刚刚访问过的结点
InThread(p->rchild,pre);//递归,线索化右子树
}
}
//中序遍历建立中序线索化二叉树(不含头结点)
void CreateInThread(ThreadTree &T){
ThreadTree pre=NULL;
if(T!=NULL){
InThread(T,pre);//线索化二叉树
pre->rchild=NULL;
pre->rtag=1;
}
}
//通过中序遍历建立中序线索化二叉树(含头结点)
void CreateInThread_head(ThreadTree &Thrt,ThreadTree &T){
//Thrt指向头结点
ThreadTree pre=NULL;
Thrt=(ThreadTree)malloc(sizeof(ThreadNode));
Thrt->data='\0';
Thrt->ltag=0;//建立头结点
Thrt->rtag=1;
Thrt->rchild=Thrt; //右指针回指
if(Thrt==NULL){
Thrt->lchild=Thrt;
}else{
Thrt->lchild=T;
pre=Thrt;
InThread(T,pre);//线索化二叉树
pre->rchild=Thrt;//最后一个结点指回头结点
pre->rtag=1;
Thrt->rchild=pre;//头结点指向最后一个结点,建立双向联系
}
}
//中序遍历二叉线索树的非递归算法
void InOrder_Thr(ThreadTree Thrt){
ThreadTree p=Thrt->lchild;//p指向根结点
while(p!=Thrt){
while(p->ltag==0){
p=p->lchild;
}
printf("%c ",p->data);
while(p->rtag==1&&p->rchild!=Thrt){
p=p->rchild;
printf("%c ",p->data);
}
p=p->rchild;
}
}
int main(){
ThreadTree Thrt;
ThreadTree T,pre=NULL;
printf("————————————————————————————△创建二叉树\n");
CreateBiTree_Thr(T);
printf("————————————————————————————△中序线索化二叉树(含头结点)\n");
//CreateInThread(T);
CreateInThread_head(Thrt,T);
printf("————————————————————————————△中序遍历线索二叉树\n");
InOrder_Thr(Thrt);
}