標籤:
1 #include <iostream> 2 using namespace std; 3 4 typedef struct TBTNode 5 { 6 char data; 7 int ltag,rtag; 8 struct TBTNode * lchild; 9 struct TBTNode * rchild; 10 }TBTNode; 11 12 TBTNode * initTBTNode() 13 { 14 TBTNode * p=(TBTNode*)malloc(sizeof(TBTNode)); 15 p->lchild=0; 16 p->rchild=0; 17 p->ltag=0; 18 p->rtag=0; 19 return p; 20 } 21 22 TBTNode * initTBTree(TBTNode * p) 23 { 24 TBTNode * A=initTBTNode(); 25 TBTNode * B=initTBTNode(); 26 TBTNode * C=initTBTNode(); 27 TBTNode * D=initTBTNode(); 28 TBTNode * E=initTBTNode(); 29 30 A->data=‘A‘; 31 B->data=‘B‘; 32 C->data=‘C‘; 33 D->data=‘D‘; 34 E->data=‘E‘; 35 36 A->lchild=B; 37 A->rchild=C; 38 B->rchild=D; 39 C->lchild=E; 40 41 p=A; 42 43 return p; 44 } 45 46 void InThread(TBTNode *p,TBTNode *&pre) 47 { 48 if(p!=0) 49 { 50 InThread(p->lchild,pre); 51 if(p->lchild==0) 52 { 53 p->lchild=pre; 54 p->ltag=1; 55 } 56 if(pre!=0&&pre->rchild==0) 57 { 58 pre->rchild=p; 59 pre->rtag=1; 60 } 61 pre=p; 62 InThread(p->rchild,pre); 63 } 64 } 65 66 TBTNode * First(TBTNode * p) 67 { 68 while(p->ltag==0) 69 p=p->lchild; 70 return p; 71 } 72 73 TBTNode * Next(TBTNode * p) 74 { 75 if(p->rtag==0) 76 return First(p->rchild); 77 else 78 return p->rchild; 79 } 80 81 void Inorder(TBTNode * root) 82 { 83 for(TBTNode *p=First(root);p!=0;p=Next(p)) 84 cout << p->data << " "; 85 cout << endl; 86 } 87 88 void createInThread(TBTNode * root) 89 { 90 TBTNode * pre =initTBTNode(); 91 if(root!=0) 92 { 93 InThread(root,pre); 94 pre->rchild=0; 95 pre->rtag=1; 96 } 97 } 98 99 int main(int argc, char* argv[])100 {101 TBTNode *p=initTBTNode();102 p=initTBTree(p);103 TBTNode *pre=initTBTNode();104 createInThread(p);105 Inorder(p);106 return 0;107 }
C++中序線索化二叉樹