//线索二叉树 线索化后二叉树就变成了一个双向链表 便于查询遍历
#include<stdio.h>
#include<stdlib.h>
typedef struct bitreenode{
char ch;
struct bitreenode *lchild,*rchild;
int ltag,rtag;
}BiTNode,*BiTree;
//先序构造
BiTree CreatePreBiTree(){
BiTree T;
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->ch=ch;
T->ltag=T->rtag=0;
T->lchild=CreatePreBiTree();
T->rchild=CreatePreBiTree();
}
return T;
}
//先序遍历
int PreTraverse(BiTree T){
if(!T) return 1;
else{
printf("%4c",T->ch);
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
return 0;
}
int InTraverse(BiTree T){
if(!T) return 1;
else{
InTraverse(T->lchild);
printf("%4c",T->ch);
InTraverse(T->rchild);
}
return 0;
}
int PostTraverse(BiTree T){
if(!T) return 1;
else{
PostTraverse(T->lchild);
PostTraverse(T->rchild);
printf("%4c",T->ch);
}
return 0;
}
//中序线索化
static BiTree pre=NULL;//上位结点
BiTree InTreading(BiTree p){
if(!p) return NULL;
else {
p->lchild=InTreading(p->lchild);
if(!p->lchild) {
p->ltag=1;
p->lchild=pre;
}
if(pre&&!pre->rchild) {
pre->rtag=1;
pre->rchild=p;
}
pre=p;
p->rchild=InTreading(p->rchild);
}
return p;
}
//有头线索化
BiTree PreTreadingHead(BiTree T){
BiTree head;
head=(BiTree)malloc(sizeof(BiTNode));
head->ltag=0;
head->rtag=1;
if(!T) {head->rchild=head;head->lchild=T;}
else{
head->lchild=T;
T=InTreading(T);
pre->rchild=head;
pre->rtag=1;
head->rchild=pre;
}
return T;
}
//中序线索链表查找p结点的后继
BiTree ThreadBiTreeNext(BiTree p){
if(!p) return NULL;
BiTree q;
if(p->rtag==1) //右标志为1 rchild就指向后继结点
q=p->rchild;
else{ //右标志为0 则找其右子树的左下角结点
q=p->rchild;
while(q->ltag==0){
q=q->lchild;
}
}
return q;
}
//中序线索插p前驱prev
BiTree ThreadBiTreePrev(BiTree p){
BiTree q;
if(p->ltag==1)
q=p->lchild;
else{
q=p->lchild;
while(q->ltag==0){
q=q->rchild;
}
}
return q;
}
//中序线索遍历
int TreadBiTreeInOrderTraverse(BiTree T){
if(!T) return -1;
else{
while(T->ltag==0){ //找中序第一个结点:左下角
T=T->lchild;
}
printf("%4c",T->ch);
while(T->rchild){ //当前结点存在后继 就依次访问
T=ThreadBiTreeNext(T);
printf("%4c",T->ch);
}
}
return 0;
}
//中序线索倒序遍历:左右对调和next/qrev同理 懒得写了
int main(){
BiTree T=CreatePreBiTree();
printf("先序 ");PreTraverse(T);printf("\n");
printf("中序 ");InTraverse(T);printf("\n");
printf("后序 ");PostTraverse(T);printf("\n");
printf("中序线索化 \n");
T=InTreading(T);
printf("中序线索遍历 ");
TreadBiTreeInOrderTraverse(T);
return 0;
}
线索二叉树备忘仅中序
最新推荐文章于 2024-07-06 22:34:06 发布