zoukankan      html  css  js  c++  java
  • 二叉树

    二叉树:

    树的一种特殊形式,它的每个节点至多有两个子节点(left node, right node),每个节点的值比它的左子树的所有节点的值都要大,但比它的右子树的所有节点的值都要小,那么这种树中就不存在值相同的节点了。

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <time.h>
      4 #include <assert.h>
      5 
      6 typedef struct _binary_tree
      7 {
      8     int             m_nVal;
      9     struct _binary_tree*     m_psLeftNode;
     10     struct _binary_tree*     m_psRightNode;
     11 }binary_tree_s;
     12 
     13 static binary_tree_s* psTree = NULL;
     14 
     15 /**
     16  * @brief    myrand 
     17  *
     18  * @param[in]    range
     19  *
     20  * @return   random number 
     21  */
     22 int myrand(int range)
     23 {
     24     srand((unsigned int)time(NULL));
     25     return (rand()%range);
     26 }
     27 
     28 void insert(int nVal)
     29 {
     30     printf("insert:%d", nVal);
     31 
     32     binary_tree_s* psCurrent = NULL;
     33     binary_tree_s** ppsLink = NULL;
     34 
     35     ppsLink = &psTree;
     36 
     37     
     38     while((psCurrent = *ppsLink) != NULL)
     39     {
     40         if (nVal < psCurrent->m_nVal)
     41         {
     42             printf("left ");
     43             ppsLink = &psCurrent->m_psLeftNode;
     44         }
     45         else
     46         {
     47             if (nVal == psCurrent->m_nVal)
     48             {
     49                 printf("nVal=%d, m_nVal=%d
    ", nVal, psCurrent->m_nVal);
     50                 return;
     51             }
     52             printf("right ");
     53             ppsLink = &psCurrent->m_psRightNode;    
     54         }
     55     
     56     }
     57 
     58     psCurrent = (binary_tree_s*)malloc(sizeof(binary_tree_s));
     59     psCurrent->m_nVal = nVal;
     60     psCurrent->m_psLeftNode = NULL;
     61     psCurrent->m_psRightNode = NULL;
     62     *ppsLink = psCurrent;
     63     printf("
    ");
     64 }
     65 
     66 binary_tree_s* find(int nVal)
     67 {
     68     binary_tree_s* psCurrent = NULL;
     69 
     70     psCurrent = psTree;
     71 
     72     while((NULL != psCurrent) && (nVal != psCurrent->m_nVal))
     73     {
     74         if (nVal < psCurrent->m_nVal)
     75             psCurrent = psCurrent->m_psLeftNode;
     76         else
     77             psCurrent = psCurrent->m_psRightNode;
     78     }
     79     
     80     if (psCurrent == NULL)
     81         return NULL;
     82     else
     83         return psCurrent;
     84 }
     85 
     86 void myprint(int nVal)
     87 {
     88     printf("val:%d
    ", nVal);
     89 }
     90 
     91 static void do_pre_order_traverse(binary_tree_s* psCurrent, void(*callback)(int nVal))
     92 {
     93     if (NULL != psCurrent)
     94     {
     95         callback(psCurrent->m_nVal);
     96         do_pre_order_traverse(psCurrent->m_psLeftNode, callback);
     97         do_pre_order_traverse(psCurrent->m_psRightNode, callback);
     98     }
     99 }
    100 
    101 void pre_order_traverse(binary_tree_s* psTree)
    102 {
    103     do_pre_order_traverse(psTree, myprint);
    104 }
    105 
    106 static void do_mid_order_traverse(binary_tree_s* psCurrent, void(*callback)(int nVal))
    107 {
    108     if (NULL != psCurrent)
    109     {
    110         do_mid_order_traverse(psCurrent->m_psLeftNode, callback);
    111         callback(psCurrent->m_nVal);
    112         do_mid_order_traverse(psCurrent->m_psRightNode, callback);
    113     }
    114 }
    115 
    116 void mid_order_traverse(binary_tree_s* psTree)
    117 {
    118     do_mid_order_traverse(psTree, myprint);
    119 }
    120 
    121 
    122 static void do_aft_order_traverse(binary_tree_s* psCurrent, void(*callback)(int nVal))
    123 {
    124     if (NULL != psCurrent)
    125     {
    126         do_aft_order_traverse(psCurrent->m_psLeftNode, callback);
    127         do_aft_order_traverse(psCurrent->m_psRightNode, callback);
    128         callback(psCurrent->m_nVal);
    129     }
    130 }
    131 
    132 void aft_order_traverse(binary_tree_s* psTree)
    133 {
    134     do_aft_order_traverse(psTree, myprint);
    135 }
    136 
    137 void destroy_tree(binary_tree_s* psNode)
    138 {
    139     binary_tree_s** ppsCur;
    140 
    141     ppsCur = &psNode;
    142 
    143     if (*ppsCur != NULL)
    144     {
    145         destroy_tree((*ppsCur)->m_psLeftNode);    
    146         destroy_tree((*ppsCur)->m_psRightNode);    
    147         free((*ppsCur));
    148         ppsCur = NULL;
    149     }
    150 }
    151 
    152 void destroy_tree2(binary_tree_s* psNode)
    153 {
    154 
    155     if (psNode != NULL)
    156     {
    157         destroy_tree(psNode->m_psLeftNode);    
    158         destroy_tree(psNode->m_psRightNode);    
    159         free(psNode);
    160         psNode = NULL;
    161     }
    162 }
    163 
    164 int main(int argc, char** argv)
    165 {
    166     srand((unsigned int)time(NULL));
    167 
    168     //printf("rand:%d", rand()%100);
    169     //printf("rand:%d", rand()%100);
    170     //printf("rand:%d", rand()%100);
    171     insert(rand()%100);
    172     insert(rand()%100);
    173     insert(rand()%100);
    174     insert(rand()%100);
    175     insert(rand()%100);
    176     insert(rand()%100);
    177     //insert(myrand(100));
    178     //insert(myrand(100));
    179 
    180 #if 0
    181     binary_tree_s* psTmp = find(49);
    182     if (NULL != psTmp)
    183         printf("val:%d
    ", psTmp->m_nVal);
    184 #endif
    185 
    186     printf("pre ord:
    ");
    187     pre_order_traverse(psTree);
    188     printf("
    mid ord:
    ");
    189     mid_order_traverse(psTree);
    190     printf("
    aft ord:
    ");
    191     aft_order_traverse(psTree);
    192 
    193     destroy_tree(psTree);
    194 
    195     printf("xxxxxxxx
    ");
    196     //pre_order_traverse(psTree);
    197 
    198     return 0;
    199 }
  • 相关阅读:
    SkyWalking结合Logback获取全局唯一标识 trace-id 记录到日志中
    Mysql数据库优化技术
    MySQL中集合的差的运算方法
    深入理解Java ClassLoader及在 JavaAgent 中的应用
    自制吸锡带
    Ubuntu下双显示器设定
    ffmpeg 命令的使用
    ifeq ifneq ifdef ifndef
    字符对齐
    ruby on rails使用gmail的smtp发送邮件
  • 原文地址:https://www.cnblogs.com/black-mamba/p/6442153.html
Copyright © 2011-2022 走看看