zoukankan      html  css  js  c++  java
  • 线索二叉树实例(前序创建,中序遍历)--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("请输入前序二叉树的内容:
    ");
    124     CreateTree(&t);
    125     InOrderThread_Head(&temp, t);       //加入头结点,并线索化  
    126     printf("输出中序二叉树的内容:
    ");  
    127     InOrderThraverse_Thr(temp);  
    128                    
    129     printf("
    ");
    130     return 0;
    131 }
    mrrs@ubuntu:~/Desktop/DSC$ ./test
    请输入前序二叉树的内容:
    ABDG##H###CE#I##F##
    输出中序二叉树的内容:
    G D H B A E I C F
  • 相关阅读:
    Study Plan The Twelfth Day
    Study Plan The Fifteenth Day
    Study Plan The Seventeenth Day
    Study Plan The Tenth Day
    Study Plan The Eighth Day
    Study Plan The Eleventh Day
    Study Plan The Sixteenth Day
    Study Plan The Thirteenth Day
    Study Plan The Fourteenth Day
    Study Plan The Ninth Day
  • 原文地址:https://www.cnblogs.com/MrRS/p/9042942.html
Copyright © 2011-2022 走看看