线索二叉树实例(前序创建,中序遍历)--2018.5.15

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef enum
  5 {
  6     Link,
  7     Tread
  8 }PointerTag;
  9 
 10 typedef char TElemType;
 11 
 12 typedef struct TreeNode
 13 {
 14     TElemType data;  //数据单元
 15 
 16     struct TreeNode *pLChild, *pRChild;  //左右孩子指针
 17     PointerTag LTag, RTag;  //左右标志 ==0:孩子指针;==1:前后驱
 18 }TreeNode, Tree;
 19 
 20 TreeNode *gPre = NULL;
 21 
 22 /* 先序创建二叉树 */
 23 void CreateTree(Tree **_t)
 24 {
 25     TElemType ch = -1;
 26 
 27     scanf("%c", &ch);
 28 
 29     if(ch == '#')
 30         *_t = NULL;
 31     else
 32     {
 33         *_t = (Tree*)malloc(sizeof(TreeNode));
 34         if(*_t == NULL)
 35             return;
 36         (*_t)->data = ch;
 37         (*_t)->LTag = Link;
 38         (*_t)->RTag = Link;
 39         CreateTree(&((*_t)->pLChild));
 40         CreateTree(&((*_t)->pRChild));
 41     }
 42 }
 43 
 44 /* 遍历二叉树 */
 45 int InOrderThraverse_Thr(Tree *_t)
 46 {
 47     Tree *p =NULL;
 48 
 49     p = _t->pLChild;
 50     while(p != _t)
 51     {
 52         while(p->LTag == Link)
 53             p = p->pLChild;
 54 
 55         printf("%c ", p->data);    //对节点的操作
 56 
 57         while((p->RTag == Tread) && (p->pRChild != _t))
 58         {
 59             p = p->pRChild;
 60             
 61             printf("%c ", p->data);
 62         }
 63         p = p->pRChild;
 64     }
 65 
 66     return 0;
 67 }
 68 
 69 void InOrderThreading(Tree *_p)
 70 {
 71     if(_p)
 72     {
 73         InOrderThreading(_p->pLChild);    //左树线索初始化
 74         if(!_p->pLChild)    //前驱线索
 75         {
 76             _p->LTag = Tread;
 77             _p->pLChild = gPre;
 78         }
 79         if(!gPre->pRChild)  //后继线索
 80         {
 81             gPre->RTag = Tread;
 82             gPre->pRChild = _p;
 83         }
 84         gPre = _p;
 85 
 86         InOrderThreading(_p->pRChild);    //右子树线索初始化
 87     }
 88 }
 89 
 90 /* 线索化二叉树 */
 91 int InOrderThread_Head(Tree **_h, Tree *_t)
 92 {
 93     (*_h) = (TreeNode *)malloc(sizeof(TreeNode));
 94     if(*_h == NULL)
 95         return -1;
 96     
 97     (*_h)->pRChild = *_h;
 98     (*_h)->RTag = Link;
 99 
100     if(!_t)
101     {
102         (*_h)->pLChild = *_h;
103         (*_h)->LTag = Link;
104     }
105     else
106     {
107         gPre = *_h;
108         (*_h)->LTag = Link;
109         (*_h)->pLChild = _t;
110         InOrderThreading(_t);
111         gPre->pRChild = *_h;
112         gPre->RTag = Tread;
113         (*_h)->pRChild = gPre;
114     }
115 
116     return 0;
117 }
118 
119 int main(void)
120 {
121     Tree *t=NULL, *temp=NULL;
122 
123     printf("请输入前序二叉树的内容:\n");
124     CreateTree(&t);
125     InOrderThread_Head(&temp, t);       //加入头结点,并线索化  
126     printf("输出中序二叉树的内容:\n");  
127     InOrderThraverse_Thr(temp);  
128                    
129     printf("\n");
130     return 0;
131 }
mrrs@ubuntu:~/Desktop/DSC$ ./test
请输入前序二叉树的内容:
ABDG##H###CE#I##F##
输出中序二叉树的内容:
G D H B A E I C F

 

posted on 2018-05-15 20:43  MrRS  阅读(1352)  评论(0编辑  收藏  举报

导航