zoukankan      html  css  js  c++  java
  • 层序遍历二叉树

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 
      5 //Real capacity is CircularQueueMaxSize -1
      6 #define CircularQueueMaxSize 1000
      7 #define MaxSize 1000
      8 
      9 typedef int TreeEleType;
     10 typedef struct BinarySearchTreeNode* QueueEleType;
     11 
     12 struct BinarySearchTreeNode
     13 {
     14     TreeEleType Element;
     15     struct BinarySearchTreeNode *Left;
     16     struct BinarySearchTreeNode *Right;
     17 };
     18 
     19 struct CircularQueue
     20 {
     21     QueueEleType QueueData[CircularQueueMaxSize];
     22     int Front;
     23     int Rear;
     24 };
     25 
     26 struct BinarySearchTreeNode *BinarySearchTreeInit()
     27 {
     28     struct BinarySearchTreeNode *TreeRoot = NULL;
     29 
     30     return TreeRoot;
     31 }
     32 
     33 int CircularQueueIsEmpty(struct CircularQueue *Queue)
     34 {
     35     return (Queue -> Front == Queue -> Rear);
     36 }
     37 
     38 int CircularQueueIsFull(struct CircularQueue *Queue)
     39 {
     40     return ((Queue -> Rear + 1) % CircularQueueMaxSize == Queue -> Front);
     41 }
     42 
     43 struct CircularQueue *CircularQueueInit()
     44 {
     45     struct CircularQueue *Queue;
     46     Queue = malloc(sizeof(struct CircularQueue));
     47 
     48     Queue -> Front = Queue -> Rear = 0;
     49 
     50     return Queue;
     51 }
     52 
     53 //if Queue is full,return 1
     54 int CircularQueueEnqueue(struct CircularQueue *Queue,QueueEleType ToBeEnqueue)
     55 {
     56     if(CircularQueueIsFull(Queue))
     57     {
     58         return 1;
     59     }
     60     else
     61     {
     62         Queue -> Rear = (Queue -> Rear + 1) % CircularQueueMaxSize;
     63         Queue -> QueueData[Queue -> Rear] = ToBeEnqueue;
     64     }
     65     return 0;
     66 }
     67 
     68 //if Queue is empty,return NULL
     69 QueueEleType CircularQueueTop(struct CircularQueue *Queue)
     70 {
     71     if(CircularQueueIsEmpty(Queue))
     72     {
     73         return NULL;
     74     }
     75     else
     76     {
     77         return Queue -> QueueData[(Queue -> Front + 1) % CircularQueueMaxSize];
     78     }
     79     return 0;
     80 }
     81 
     82 //if Queue is empty,return 1
     83 int CircularQueueDequeue(struct CircularQueue *Queue)
     84 {
     85     if(CircularQueueIsEmpty(Queue))
     86     {
     87         return 1;
     88     }
     89     else
     90     {
     91         Queue -> Front = (Queue -> Front + 1) % CircularQueueMaxSize;
     92         return 0;
     93     }
     94 }
     95 
     96 int MakeCircularQueueEmpty(struct CircularQueue *Queue)
     97 {
     98     Queue -> Front = Queue -> Rear = 0;
     99 
    100     return 0;
    101 }
    102 
    103 int CircularQueueDelete(struct CircularQueue *Queue)
    104 {
    105     free(Queue);
    106     Queue = NULL;
    107     return 0;
    108 }
    109 int BinarySearchTreeDestroy(struct BinarySearchTreeNode *TreeRoot)
    110 {
    111     if(TreeRoot != NULL)
    112     {
    113         BinarySearchTreeDestroy(TreeRoot -> Left);
    114         BinarySearchTreeDestroy(TreeRoot -> Right);
    115         free(TreeRoot);
    116     }
    117     return 0;
    118 }
    119 
    120 struct BinarySearchTreeNode *BinarySearchTreeNodeFind(TreeEleType ToBeFind,struct BinarySearchTreeNode *TreeRoot)
    121 {
    122     if(TreeRoot==NULL)
    123     {
    124         return NULL;
    125     }
    126 
    127     if(ToBeFind < TreeRoot -> Element)
    128     {
    129         return BinarySearchTreeNodeFind(ToBeFind,TreeRoot->Left);
    130     }
    131     else if(ToBeFind > TreeRoot -> Element)
    132     {
    133         return BinarySearchTreeNodeFind(ToBeFind,TreeRoot->Right);
    134     }
    135     else
    136     {
    137         return TreeRoot;
    138     }
    139 }
    140 
    141 struct BinarySearchTreeNode *BinarySearchTreeNodeFindMin(struct BinarySearchTreeNode *TreeRoot)
    142 {
    143     if(TreeRoot==NULL)
    144     {
    145         return NULL;
    146     }
    147     else if(TreeRoot->Left==NULL)
    148     {
    149         return TreeRoot;
    150     }
    151     else
    152     {
    153         return BinarySearchTreeNodeFindMin(TreeRoot->Left);
    154     }
    155 }
    156 
    157 struct BinarySearchTreeNode *BinarySearchTreeNodeFindMax(struct BinarySearchTreeNode *TreeRoot)
    158 {
    159     if(TreeRoot==NULL)
    160     {
    161         return NULL;
    162     }
    163     else if(TreeRoot->Right==NULL)
    164     {
    165         return TreeRoot;
    166     }
    167     else
    168     {
    169         return BinarySearchTreeNodeFindMax(TreeRoot->Right);
    170     }
    171 }
    172 
    173 //be careful of return NULL
    174 struct BinarySearchTreeNode *BinarySearchTreeNodeInsert(TreeEleType ToBeInsert,struct BinarySearchTreeNode *TreeRoot)
    175 {
    176     if(TreeRoot==NULL)
    177     {
    178         TreeRoot = malloc(sizeof(struct BinarySearchTreeNode));
    179         TreeRoot -> Element = ToBeInsert;
    180         TreeRoot -> Left = TreeRoot -> Right = NULL;
    181     }
    182     else if(ToBeInsert < TreeRoot->Element)
    183     {
    184         TreeRoot -> Left = BinarySearchTreeNodeInsert(ToBeInsert,TreeRoot->Left);
    185     }
    186     else if(ToBeInsert > TreeRoot->Element)
    187     {
    188         TreeRoot -> Right = BinarySearchTreeNodeInsert(ToBeInsert,TreeRoot->Right);
    189     }
    190     return TreeRoot;
    191 }
    192 
    193 //if doesn't find,return NULL
    194 struct BinarySearchTreeNode *BinarySearchTreeNodeDelete(TreeEleType ToBeDelete,struct BinarySearchTreeNode *TreeRoot)
    195 {
    196     if(TreeRoot == NULL)
    197         return NULL;
    198 
    199     struct BinarySearchTreeNode *TmpCell;
    200 
    201     if(ToBeDelete < TreeRoot -> Element)
    202     {
    203         TreeRoot -> Left = BinarySearchTreeNodeDelete(ToBeDelete,TreeRoot->Left);
    204     }
    205     else if(ToBeDelete > TreeRoot -> Element)
    206     {
    207         TreeRoot -> Right = BinarySearchTreeNodeDelete(ToBeDelete,TreeRoot->Right);
    208     }
    209     else //if(ToBeDelete == TreeRoot -> Element)
    210     {
    211         if(TreeRoot->Left && TreeRoot->Right)
    212         {
    213             TmpCell = BinarySearchTreeNodeFindMin(TreeRoot -> Right);
    214             TreeRoot -> Element = TmpCell -> Element;
    215             TreeRoot -> Right = BinarySearchTreeNodeDelete(TreeRoot->Element,TreeRoot->Right);
    216         }
    217         else
    218         {
    219             TmpCell = TreeRoot;
    220             if(TreeRoot->Left==NULL)
    221             {
    222                 TreeRoot = TreeRoot -> Right;
    223             }
    224             else if(TreeRoot->Right==NULL)
    225             {
    226                 TreeRoot = TreeRoot -> Left;
    227             }
    228             free(TmpCell);
    229         }
    230     }
    231     return TreeRoot;
    232 }
    233 
    234 int BinarySearchTreeLevelOrder(struct BinarySearchTreeNode *TreeRoot)
    235 {
    236     struct CircularQueue *Queue;
    237     Queue = CircularQueueInit();
    238     CircularQueueEnqueue(Queue,TreeRoot);
    239     while(!CircularQueueIsEmpty(Queue))
    240     {
    241         struct BinarySearchTreeNode *NodePtr = CircularQueueTop(Queue);
    242         printf("%d ",NodePtr->Element);
    243         CircularQueueDequeue(Queue);
    244         if(NodePtr->Left != NULL)
    245         {
    246             CircularQueueEnqueue(Queue,NodePtr->Left);
    247         }
    248         if(NodePtr->Right != NULL)
    249         {
    250             CircularQueueEnqueue(Queue,NodePtr->Right);
    251         }
    252     }
    253     return 0;
    254 }
    255 
    256 int main()
    257 {
    258     struct BinarySearchTreeNode *TreeRoot = BinarySearchTreeInit();
    259     TreeRoot = BinarySearchTreeNodeInsert(5,TreeRoot);
    260     TreeRoot = BinarySearchTreeNodeInsert(6,TreeRoot);
    261     TreeRoot = BinarySearchTreeNodeInsert(3,TreeRoot);
    262     TreeRoot = BinarySearchTreeNodeInsert(7,TreeRoot);
    263     TreeRoot = BinarySearchTreeNodeInsert(2,TreeRoot);
    264     TreeRoot = BinarySearchTreeNodeInsert(4,TreeRoot);
    265     TreeRoot = BinarySearchTreeNodeInsert(1,TreeRoot);
    266     BinarySearchTreeLevelOrder(TreeRoot);
    267     return 0;
    268 }
  • 相关阅读:
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    LRU缓存实现(Java)
    Java实现LRU(最近最少使用)缓存
    HashSet,TreeSet和LinkedHashSet的区别
    IIS-详解IIS中URL重写工具的规则条件(Rule conditions)
    IIS-代理
    IIS-新建网站
    IIS-反向代理配置&&插件安装
    IIS-C#项目环境搭建
    IIS-Windows10如何安装
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9504844.html
Copyright © 2011-2022 走看看