基本思想:
第一個訪問的結點應該是最左下角的結點
假設剛才訪問的結點是p
然后P的后繼是誰?
若p->rchild是指針,說明P有右子樹,下一個結點應該是P右子樹中最左下角的結點
若p->rchild是線索,直接訪問p->rchild
如此循環往復...
1 #include <iostream> 2 #include <stdio.h> 3 4 using namespace std; 5 6 typedef char TElemType; 7 enum PointerTag{ Link,Thread };//Link == 0 :指針,Thread == 1 :線索 8 typedef struct BiThrNode 9 { 10 TElemType data; 11 struct BiThrNode *lchild,*rchild; 12 PointerTag LTag,RTag; 13 }BiThrNode,*BiThrPtr; 14 15 BiThrPtr pre=NULL;//定義全局變量 16 17 //默認按前序遍歷的順序輸入,尾結點用#表示 18 int Create_BiThrTree(BiThrPtr& T) 19 { 20 TElemType c; 21 //cout << "請輸入當前節點元素值:" << endl; 22 cin>>c; 23 if(c == '#') T=NULL; 24 else 25 { 26 T = new BiThrNode; 27 T->data=c; 28 T->LTag=Link; 29 T->RTag=Link; 30 Create_BiThrTree(T->lchild); 31 Create_BiThrTree(T->rchild); 32 } 33 return 0; 34 } 35 36 //中序遍歷輸入各節點 37 int InOrderDisplay(BiThrPtr& T) 38 { 39 if(T) 40 { 41 InOrderDisplay(T->lchild); 42 cout << T->data <<" "; 43 InOrderDisplay(T->rchild); 44 } 45 return 0; 46 } 47 48 49 int InOrderTraverse(BiThrPtr& T) 50 { 51 extern BiThrPtr pre;//聲明全局變量 52 if(T) 53 { 54 InOrderTraverse(T->lchild); 55 if(!T->lchild) 56 { 57 T->LTag = Thread; 58 T->lchild = pre; 59 } 60 if(!pre->rchild) 61 { 62 pre->RTag = Thread; 63 pre->rchild = T; 64 } 65 pre = T; 66 InOrderTraverse(T->rchild); 67 } 68 return 0; 69 } 70 71 int InOrderThreading(BiThrPtr &H,BiThrPtr& T) 72 { 73 H = new BiThrNode;//額外添加的頭結點 74 H->data = '#'; 75 H->LTag = Link; 76 H->RTag = Thread; 77 H->rchild = H; 78 if(!T) 79 { 80 H->lchild = H; 81 } 82 else 83 { 84 H->lchild = T; 85 pre = H; 86 InOrderTraverse(T); 87 pre->RTag = Thread; 88 pre->rchild = H; 89 H->rchild = pre; 90 } 91 return 0; 92 } 93 94 95 int InOrderTraverse_Thr(BiThrPtr H) //T為頭節點 96 { 97 BiThrPtr p; 98 p = H->lchild; //p指向樹根 99 while(p != H) //p等於T則說明已經遍歷完畢 100 { 101 while(p->LTag == Link) //p->lchild為指針 102 p = p->lchild; //則向左下走到底 103 cout << p->data << " "; 104 while(p->RTag == Thread && p->rchild != H) //p->rchild為線索 105 { 106 p = p->rchild; //訪問p->rchild 107 cout << p->data << " "; 108 } 109 p = p->rchild; //向右走 110 } 111 return 0; 112 } 113 114 int main() 115 { 116 freopen( "input.txt", "r", stdin );//從input.txt中讀取輸入數據 117 BiThrPtr T=NULL,H=NULL; 118 Create_BiThrTree(T);//前序遍歷創建二叉樹 119 InOrderDisplay(T);//用於驗證下面的線索中序遍歷輸出結果是否正確 120 cout << endl; 121 InOrderThreading(H,T); 122 InOrderTraverse_Thr(H); 123 cout << endl; 124 fclose(stdin); 125 return 0; 126 }
txt中的測試數據:
ABC##D##E#F##
輸出結果:C B D A E F

