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
  • 相关阅读:
    redis的两种备份方式
    Vue—事件修饰符
    css3实现颤动的动画
    初学者可能不知道的vue技巧
    使用slot-scope复制vue中slot内容
    pre-commit钩子,代码质量检查
    爬虫可视化点选配置工具之获取鼠标点选元素
    Vue源码探究-事件系统
    使用electron实现百度网盘悬浮窗口功能!
    electron实现qq快捷登录!
  • 原文地址:https://www.cnblogs.com/MrRS/p/9042942.html
Copyright © 2011-2022 走看看