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 }
  • 相关阅读:
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    实验 3:Mininet 实验——测量路径的损耗率
    软件工程第一次作业
    实验 2:Mininet 实验——拓扑的命令脚本生成
    实验 1:Mininet 源码安装和可视化拓扑工具
    软件工程第一次作业
    软工实践个人总结
    2020软工第二次结对作业
  • 原文地址:https://www.cnblogs.com/10jschen/p/2664900.html
Copyright © 2011-2022 走看看