二叉树

二叉树:

树的一种特殊形式,它的每个节点至多有两个子节点(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 }
原文地址:https://www.cnblogs.com/black-mamba/p/6442153.html