中序遍歷線索二叉樹【代碼】


基本思想:

第一個訪問的結點應該是最左下角的結點

假設剛才訪問的結點是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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM