zoukankan      html  css  js  c++  java
  • 二叉树的遍历方法

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <stdlib.h>
      4 #define N 100
      5 
      6 typedef char datatype;
      7 void visit(datatype data);
      8 
      9 typedef struct bnode
     10 {
     11     datatype data;
     12     struct bnode *lchild, *rchild;
     13 } BTNode, *BTree, **B_BTree;
     14 
     15 typedef struct stack
     16 {
     17     BTree node[N];
     18     //int tag[N];
     19     int top;
     20 } Stack;
     21 
     22 void push(Stack *s, BTree T)
     23 {
     24     s->node[++s->top] = T;
     25 }
     26 
     27 BTree get_top(Stack *s)
     28 {
     29     return s->node[s->top];
     30 }
     31 
     32 BTree pop(Stack *s)
     33 {
     34     if(s->top != -1)
     35     {
     36         s->top--;
     37         return s->node[s->top + 1];
     38     }
     39     else
     40     {
     41         return NULL;
     42     }
     43 }
     44 
     45 void visit(datatype data)
     46 {
     47     printf("%c", data);
     48 }
     49 
     50 void preorder(BTree T)
     51 {
     52     if(T)
     53     {
     54         visit(T->data);
     55         preorder(T->lchild);
     56         preorder(T->rchild);
     57     }
     58 }
     59 
     60 void inorder(BTree T)
     61 {
     62     if(T)
     63     {
     64         inorder(T->lchild);
     65         visit(T->data);
     66         inorder(T->rchild);
     67     }
     68 }
     69 
     70 void postorder(BTree T)
     71 {
     72     if(T)
     73     {
     74         postorder(T->lchild);
     75         postorder(T->rchild);
     76         visit(T->data);
     77     }
     78 }
     79 
     80 void cur_preorder(BTree t)
     81 {
     82     Stack s;
     83     BTree temp = t;
     84     s.top = -1;
     85     while(temp || s.top != -1)
     86     {
     87         while(temp)
     88         {
     89             visit(temp->data);
     90             push(&s, temp);
     91             temp = temp->lchild;
     92         }
     93         if(s.top > -1)
     94         {
     95             temp = pop(&s);
     96             temp = temp->rchild;
     97         }
     98     }
     99 }
    100 
    101 void cur_inorder(BTree t)
    102 {
    103     Stack s;
    104     BTree temp = t;
    105     s.top = -1;
    106     while(temp || s.top != -1)
    107     {
    108         while(temp)
    109         {
    110             push(&s, temp);
    111             temp = temp->lchild;
    112         }
    113         if(s.top > -1)
    114         {
    115             temp = pop(&s);
    116             visit(temp->data);
    117             temp = temp->rchild;
    118         }
    119     }
    120 }
    121 
    122 void cur_postorder(BTree t)
    123 {
    124     Stack s;
    125     BTree temp, pre = NULL;
    126     temp = t;
    127     s.top = -1;
    128     while(temp || s.top != -1)
    129     {
    130         while(temp)
    131         {
    132             push(&s, temp);
    133             temp = temp->lchild;
    134         }
    135         temp = get_top(&s);
    136         if(temp->rchild == NULL
    137            || temp->rchild == pre)
    138            {
    139                visit(temp->data);
    140                pre = temp;
    141                temp = NULL;
    142                pop(&s);
    143            }
    144            else
    145            {
    146                temp = temp->rchild;
    147            }
    148     }
    149 }
    150 
    151 /*层次遍历*/
    152 typedef struct
    153 {
    154     BTree node[N];
    155     int front;
    156     int rear;
    157 }   queue;
    158 
    159 void init_queue(queue *Q)
    160 {
    161     Q->front = Q->rear = 0;
    162 }
    163 
    164 void en_queue(queue *Q, BTree e)
    165 {
    166     Q->node[Q->rear] = e;
    167     Q->rear = (Q->rear + 1) % N;
    168 }
    169 
    170 void de_queue(queue *Q, B_BTree e)
    171 {
    172     *e = Q->node[Q->front];
    173     Q->front = (Q->front + 1) % N;
    174 }
    175 
    176 int is_empty(queue *Q)
    177 {
    178     return Q->rear == Q->front;
    179 }
    180 
    181 void level_order(BTree t)
    182 {
    183     queue Q;
    184     init_queue(&Q);
    185     BTree p = t;
    186     if(p)
    187     {
    188         en_queue(&Q, p);
    189         while(!is_empty(&Q))
    190         {
    191             de_queue(&Q, &p);
    192             visit(p->data);
    193             if(p->lchild)
    194             {
    195                 en_queue(&Q, p->lchild);
    196             }
    197             if(p->rchild)
    198             {
    199                 en_queue(&Q, p->rchild);
    200             }
    201         }
    202     }
    203 }
    204 
    205 void create_tree(B_BTree T)
    206 {
    207     char temp;
    208     temp = getchar();
    209     if(temp == ' ')
    210     {
    211         *T = NULL;
    212     }
    213     else
    214     {
    215         (*T) = (BTNode *)malloc(sizeof(BTNode));
    216         (*T)->data = temp;
    217         create_tree(&(*T)->lchild);
    218         create_tree(&(*T)->rchild);
    219     }
    220 }
    221 
    222 int main()
    223 {
    224     BTree T;
    225     printf("请按次数顺序输入字符:\n");
    226     create_tree(&T);
    227     preorder(T);
    228     printf("\n");
    229     cur_preorder(T);
    230     printf("\n");
    231     inorder(T);
    232     printf("\n");
    233     cur_inorder(T);
    234     printf("\n");
    235     postorder(T);
    236     printf("\n");
    237     cur_postorder(T);
    238     printf("\n");
    239     level_order(T);
    240     printf("\n");
    241     return 0;
    242 }
  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/10jschen/p/2664900.html
Copyright © 2011-2022 走看看