zoukankan      html  css  js  c++  java
  • 二叉树的建立和遍历

    今天复习了二叉树的相关知识,写了点简单的二叉树建立和遍历的代码,作为备忘``

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define MAX_TREENODE_NUM 100
      5 
      6 // 二叉树节点结构
      7 typedef struct bitnode
      8 {
      9     char data;                  // 节点存储的数据
     10     struct bitnode *lchild;     // 左孩子
     11     struct bitnode *rchild;     // 右孩子
     12 }bitnode,*bitree;
     13 
     14 // 前序建树:方式1
     15 bitree create_tree(bitree t)
     16 {
     17     t = (bitree)malloc(sizeof(bitnode));
     18     if(t == NULL){
     19         return t;
     20     }
     21     char c;
     22     scanf("%c",&c);
     23     if(c == ' '){               // 空格表示叶子
     24         t = NULL;
     25     }
     26     else{
     27         t->data = c;
     28         t->lchild = create_tree(t->lchild);
     29         t->rchild = create_tree(t->rchild);
     30     }
     31     return t;
     32 }
     33 // 前序建树:方式2
     34 /*
     35 void create_tree(bitree *t)
     36 {
     37     *t = (bitree)malloc(sizeof(bitnode));
     38     if(*t == NULL){
     39         return;
     40     }
     41     char c;
     42     scanf("%c",&c);
     43     if(c == ' '){               // 空格表示叶子
     44         *t = NULL;
     45         return;
     46     }
     47     else{
     48         (*t)->data = c;
     49         create_tree(&(*t)->lchild);
     50         create_tree(&(*t)->rchild);
     51     }
     52 }*/
     53 
     54 // 前序遍历
     55 void pre_sequence(bitree t)
     56 {
     57     if(t == NULL){
     58         return;
     59     }
     60     printf("%c",t->data);
     61     pre_sequence(t->lchild);
     62     pre_sequence(t->rchild);
     63 }
     64 // 中序遍历
     65 void mid_sequence(bitree t)
     66 {
     67     if(t == NULL){
     68         return;
     69     }
     70     mid_sequence(t->lchild);
     71     printf("%c",t->data);
     72     mid_sequence(t->rchild);
     73 }
     74 // 后序遍历
     75 void bak_sequence(bitree t)
     76 {
     77     if(t == NULL){
     78         return;
     79     }
     80     bak_sequence(t->lchild);
     81     bak_sequence(t->rchild);
     82     printf("%c",t->data);
     83 }
     84 // 层序遍历
     85 typedef struct{
     86     int first;
     87     int last;
     88     bitree que[MAX_TREENODE_NUM];                
     89 }Queue;
     90 
     91 void initQueue(Queue *q)                            // 初始化队列
     92 {
     93     q->first = q->last = 0;
     94 }
     95 int QueueEmpty(Queue *q)                            // 判断队列为空
     96 {
     97     return q->last==q->first;
     98 }
     99 int QueueFull(Queue *q)                             // 判断队列为满
    100 {
    101     return (q->last-q->first) == MAX_TREENODE_NUM;
    102 }
    103 void DeQueue(Queue *q,bitree *t)                       // 出队
    104 {
    105     *t = q->que[q->first];
    106     q->first = (q->first+1)%MAX_TREENODE_NUM;
    107 }
    108 void EnQueue(Queue *q,bitree t)                        // 入队
    109 {
    110     q->que[q->last] = t;
    111     q->last = (q->last+1)%MAX_TREENODE_NUM;
    112 }
    113 
    114 void BFSTraverse(bitree t)
    115 {
    116     Queue q;
    117     bitree k;
    118     
    119     initQueue(&q);
    120 
    121     EnQueue(&q,t);    
    122     while(!QueueEmpty(&q)){
    123         DeQueue(&q,&k);
    124         printf("%c",k->data);
    125 
    126         if (k->lchild){
    127             EnQueue(&q,k->lchild);
    128         }
    129         if (k->rchild){
    130             EnQueue(&q,k->rchild);
    131         }
    132     }
    133     printf("
    ");   
    134 }
    135 
    136 // 打印二叉树
    137 void print(bitree t,int n)
    138 {
    139     if(t == NULL){
    140         return;
    141     }
    142     int i;
    143     for (i=0;i<n;i++){
    144         printf(" ");
    145     }
    146     printf("%c
    ",t->data);
    147     print(t->lchild,n+4);
    148     print(t->rchild,n+4);
    149 }
    150 
    151 int main()
    152 {
    153     bitree t;
    154 
    155     // 方式1建树
    156     t = create_tree(t);
    157     // 方式2建树
    158     // create_tree(&t);
    159 
    160     print(t,0);
    161 
    162     printf("前序遍历:");
    163     pre_sequence(t);
    164     printf("
    ");
    165     printf("中序遍历:");
    166     mid_sequence(t);
    167     printf("
    ");
    168     printf("后序遍历:");
    169     bak_sequence(t);
    170     printf("
    ");
    171     printf("层序遍历:");
    172     BFSTraverse(t);
    173 
    174     return 0;
    175 }

    测试用例与结果:

  • 相关阅读:
    Oracle 数据库简介
    Qt 中事件与处理
    npm常用命令总结
    自适应宽度布局
    原生js发送ajax请求
    微信调试本地环境代码
    多行文本溢出显示省略号
    清除浮动
    用JQuery动态为选中元素添加/删除类
    input中加入搜索图标
  • 原文地址:https://www.cnblogs.com/raul-ac/p/3251371.html
Copyright © 2011-2022 走看看