資料結構——線索二叉樹的基本操作
阿新 • • 發佈:2018-11-29
線索二叉樹的基本操作
#include<stdio.h> #include<stdlib.h> typedef struct Node{ //二叉樹的鏈式儲存結點 char data; struct Node *Lchild; struct Node *Rchild; int Ltag; int Rtag; }BiTNode,*BiTree; void CreateBiTree(BiTree *root){ //形參採用二級指標,實參為結點孩子域地址 char ch; ch=getchar(); if(ch=='#') *root=NULL; else{ *root=(BiTree)malloc(sizeof(BiTree)); (*root)->data=ch; CreateBiTree(&((*root)->Lchild)); CreateBiTree(&((*root)->Rchild)); } } void Visit(char data){ printf("%c",data); } void InOrder(BiTree T){ //中序遞迴遍歷 if(T){ InOrder(T->Lchild); Visit(T->data); InOrder(T->Rchild); } } BiTree pre = NULL; //全域性變數,pre 指向剛剛訪問的樹結點 void Inthread(BiTree T){ //中序線索化(遞迴) if(T!=NULL){ Inthread(T->Lchild); //線索化左子樹 if(T->Lchild==NULL){ //若左孩子為空,置前驅線索 T->Lchild=pre; T->Ltag=1; } if(pre!=NULL&&pre->Rchild==NULL){ //若前驅右孩子為空,置其後繼線索 pre->Rchild=T; pre->Rtag=1; } pre=T; Inthread(T->Rchild); //線索右子樹 } } BiTree InPre(BiTree T){ //中序線索樹找結點前驅 BiTree Pre; if(T->Ltag==1) Pre=T->Lchild; //直接利用線索 else{ for(BiTree q=T->Lchild;q->Rtag==0;q=q->Rchild) //在T的左子樹中查詢最右下端的結點 Pre=q; } return (Pre); } BiTree InNext(BiTree T){ //中序線索樹找結點後繼 BiTree Next; if(T->Rtag==1) Next=T->Rchild; //直接利用線索 else{ for(BiTree q=T->Rchild;q->Ltag==0;q=q->Lchild) //在T的左子樹中查詢最右下端的結點 Next=q; } return (Next); } BiTree InFirst(BiTree T){ //中序線索樹中求遍歷的第一個結點 BiTree p=T; if(p==NULL) return (NULL); while(p->Ltag==0) p=p->Lchild; return p; } void TiOrder(BiTree T){ //遍歷中序二叉線索樹 BiTree p; p=InFirst(T); while(p!=NULL){ Visit(p->data); p=InNext(p); } } int main(){ BiTree T; CreateBiTree(&T); InOrder(T); return 0; }