首页 > 代码库 > 二叉树实现例子
二叉树实现例子
1 #ifndef TREE_H_ 2 #define TREE_H_ 3 4 #include <stdbool.h> 5 #define STRSIZE 32 6 #define TREEMAX 10 7 8 typedef struct item 9 {10 char petname[STRSIZE];11 char petkind[STRSIZE];12 } Item;13 14 typedef struct node15 {16 Item item;17 struct node * left;18 struct node * right;19 } Node;20 21 typedef struct tree22 {23 Node * root;24 int size;25 } Tree;26 27 void InitializeTree(Tree * ptree);28 29 bool TreeIsEmpty(const Tree * ptree);30 31 bool TreeIsFull(const Tree * ptree);32 33 int TreeItemCount(const Tree * ptree);34 35 bool AddItem(const Item * pitem, Tree * ptree);36 37 bool DeleteItem(const Item * pitem, Tree * ptree);38 39 bool CheckItem(const Item * pitem, const Tree * ptree);40 41 void Traverse(const Tree * ptree, void (* pfun)(Item item));42 43 void DeleteAll(Tree * ptree);44 45 #endif
1 #include <stdio.h> 2 #include <string.h> 3 #include "tree.h" 4 5 char menu(void); 6 void addpet(Tree * ptree); 7 void deletepet(Tree * ptree); 8 void checkpet(const Tree * ptree); 9 void numberpets(const Tree * ptree); 10 void showpets(const Tree * ptree); 11 void printitem(Item item); 12 13 int main(void) 14 { 15 Tree pets; 16 17 InitializeTree(&pets); 18 19 char choice; 20 while(‘q‘ != (choice = menu())) 21 { 22 switch(choice) 23 { 24 case ‘a‘: addpet(&pets); 25 break; 26 case ‘d‘: deletepet(&pets); 27 break; 28 case ‘c‘: checkpet(&pets); 29 break; 30 case ‘n‘: numberpets(&pets); 31 break; 32 case ‘s‘: showpets(&pets); 33 break; 34 default: printf("Unknow command!\n"); 35 break; 36 } 37 } 38 DeleteAll(&pets); 39 printf("Bye!\n"); 40 41 return 0; 42 } 43 44 void eatline(void) 45 { 46 while(‘\n‘ != getchar()) 47 continue; 48 } 49 50 char menu(void) 51 { 52 char ch; 53 54 printf("<a. add d. delete c. check n. number s. show>\n"); 55 while(EOF != (ch = getchar())) 56 { 57 eatline(); 58 if(NULL == strchr("adcns", ch)) 59 { 60 printf("invalid input!\n"); 61 printf("<a. add d. delete c. check n. number s. show>\n"); 62 continue; 63 } 64 else 65 break; 66 } 67 if(EOF == ch) 68 ch = ‘q‘; 69 70 return ch; 71 } 72 73 void addpet(Tree * ptree) 74 { 75 if(TreeIsFull(ptree)) 76 { 77 fprintf(stderr, "addpet error: tree is full!\n"); 78 return; 79 } 80 81 Item temp; 82 83 printf("Enter pet name to add: "); 84 gets(temp.petname); 85 printf("Enter pet kind to add: "); 86 gets(temp.petkind); 87 AddItem(&temp, ptree); 88 } 89 90 void deletepet(Tree * ptree) 91 { 92 Item temp; 93 94 if(TreeIsEmpty(ptree)) 95 { 96 fprintf(stderr, "deletepet error: tree is empty!\n"); 97 return; 98 } 99 100 printf("Enter pet name to delete: ");101 gets(temp.petname);102 printf("Enter pet kind to delete: ");103 gets(temp.petkind);104 printf("<%s - %s> ", temp.petname, temp.petkind);105 if(DeleteItem(&temp, ptree))106 printf("delete success.\n");107 else108 printf("delete failed.\n");109 }110 111 void checkpet(const Tree * ptree)112 {113 if(TreeIsEmpty(ptree))114 {115 printf("Tree is empty!\n");116 return;117 }118 119 Item temp;120 121 printf("Enter pet name to check: ");122 gets(temp.petname);123 printf("Enter pet kind to check: ");124 gets(temp.petkind);125 printf("<%s - %s> ", temp.petname, temp.petkind);126 if(CheckItem(&temp, ptree))127 printf("check true.\n");128 else129 printf("check false.\n");130 }131 132 void numberpets(const Tree * ptree)133 {134 printf("pets count: %d\n", TreeItemCount(ptree));135 }136 137 void showpets(const Tree * ptree)138 {139 if(TreeIsEmpty(ptree))140 printf("Tree is empty.\n");141 else142 Traverse(ptree, printitem);143 }144 145 void printitem(Item item)146 {147 printf("Name: %s, Kind: %s\n", item.petname, item.petkind);148 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "tree.h" 4 5 typedef struct pair 6 { 7 Node * parent; 8 Node * self; 9 } Pair; 10 11 12 13 static Pair SeekItem(const Item * pitem, const Tree * ptree); 14 static void InOrder(const Node * root, void (* pfun)(Item item)); 15 static void DeleteNode(Node ** ppnode); 16 static bool ToLeft(const Item * pitem, const Item * pitem2); 17 static bool ToRight(const Item * pitem, const Item * pitem2); 18 static void DeleteAllNodes(Node * root); 19 static void AddNode(Node * pnew, Node * root); 20 static Node * CreateNode(const Item * pitem); 21 22 23 void InitializeTree(Tree * ptree) 24 { 25 ptree->root = NULL; 26 ptree->size = 0; 27 } 28 29 bool TreeIsEmpty(const Tree * ptree) 30 { 31 return 0 == ptree->size; 32 } 33 34 bool TreeIsFull(const Tree * ptree) 35 { 36 return TREEMAX == ptree->size; 37 } 38 39 int TreeItemCount(const Tree * ptree) 40 { 41 return ptree->size; 42 } 43 44 bool AddItem(const Item * pitem, Tree * ptree) 45 { 46 if(TreeIsFull(ptree)) 47 { 48 fprintf(stderr, "Tree is full"); 49 return false; 50 } 51 if(NULL != SeekItem(pitem, ptree).self) 52 { 53 fprintf(stderr, "Add item error: duplicate item.\n"); 54 return false; 55 } 56 57 Node * pnew; 58 pnew = CreateNode(pitem); 59 if(NULL == pnew) 60 { 61 fprintf(stderr, "Create node failed!\n"); 62 return false; 63 } 64 65 if(NULL == ptree->root) 66 ptree->root = pnew; 67 else 68 AddNode(pnew, ptree->root); 69 70 ptree->size++; 71 72 return true; 73 } 74 75 bool DeleteItem(const Item * pitem, Tree * ptree) 76 { 77 Pair look; 78 79 look = SeekItem(pitem, ptree); 80 if(NULL == look.self) 81 return false; 82 83 if(NULL == look.parent) 84 DeleteNode(&ptree->root); 85 else if(look.parent->left == look.self) 86 DeleteNode(&look.parent->left); 87 else 88 DeleteNode(&look.parent->right); 89 90 ptree->size--; 91 92 return true; 93 } 94 95 bool CheckItem(const Item * pitem, const Tree * ptree) 96 { 97 return (NULL == SeekItem(pitem, ptree).self) ? false : true; 98 } 99 100 void Traverse(const Tree * ptree, void (* pfun)(Item item))101 {102 if(NULL != ptree)103 InOrder(ptree->root, pfun);104 }105 106 void DeleteAll(Tree * ptree)107 {108 if(NULL != ptree)109 DeleteAllNodes(ptree->root);110 ptree->root = NULL;111 ptree->size = 0;112 }113 114 static void InOrder(const Node * root, void (* pfun)(Item item))115 {116 if(NULL != root)117 {118 InOrder(root->left, pfun);119 (*pfun)(root->item);120 InOrder(root->right, pfun);121 }122 }123 124 static void DeleteAllNodes(Node * root)125 {126 Node * pleft, * pright;127 128 129 if(NULL != root)130 {131 pleft = root->left;132 pright = root->right;133 134 DeleteAllNodes(pleft);135 free(root);136 DeleteAllNodes(pright);137 }138 }139 140 static void AddNode(Node * pnew, Node * root)141 {142 if(ToLeft(&pnew->item, &root->item))143 {144 if(NULL == root->left)145 root->left = pnew;146 else147 AddNode(pnew, root->left);148 }149 else if(ToRight(&pnew->item, &root->item))150 {151 if(NULL == root->right)152 root->right = pnew;153 else154 AddNode(pnew, root->right);155 }156 else157 {158 fprintf(stderr, "location error in AddNode()\n");159 exit(1);160 }161 }162 163 static bool ToLeft(const Item * pitem, const Item * pitem2)164 {165 int comp;166 167 if((comp = strcmp(pitem->petname, pitem2->petname)) < 0)168 return true;169 else if(0 == comp && strcmp(pitem->petkind, pitem2->petkind) < 0)170 return true;171 else172 return false;173 }174 175 static bool ToRight(const Item * pitem, const Item * pitem2)176 {177 int comp;178 179 if((comp = strcmp(pitem->petname, pitem2->petname)) > 0)180 return true;181 else if(0 == comp && strcmp(pitem->petkind, pitem2->petkind) > 0)182 return true;183 else184 return false;185 }186 187 static Node * CreateNode(const Item * pitem)188 {189 Node * pnew;190 191 pnew = (Node *)malloc(sizeof(Node));192 if(NULL != pnew)193 {194 pnew->item = *pitem;195 pnew->left = NULL;196 pnew->right = NULL;197 }198 199 return pnew;200 }201 202 static Pair SeekItem(const Item * pitem, const Tree * ptree)203 {204 Pair look;205 look.parent = NULL;206 look.self = ptree->root;207 208 if(NULL == look.self)209 return look;210 211 while(NULL != look.self)212 {213 if(ToLeft(pitem, &(look.self->item)))214 {215 look.parent = look.self;216 look.self = look.self->left;217 }218 else if(ToRight(pitem, &(look.self->item)))219 {220 look.parent = look.self;221 look.self = look.self->right;222 }223 else224 break;225 }226 227 return look;228 }229 230 static void DeleteNode(Node ** ppnode)231 {232 Node * temp;233 234 printf("%s\n", (*ppnode)->item.petname);235 236 if(NULL == (*ppnode)->left)237 {238 temp = *ppnode;239 *ppnode = (*ppnode)->right;240 free(temp);241 }242 else if(NULL == (*ppnode)->right)243 {244 temp = *ppnode;245 *ppnode = (*ppnode)->left;246 free(temp);247 }248 else249 {250 for(temp = (*ppnode)->left; NULL != temp->right; temp = temp->right)251 continue;252 temp->right = (*ppnode)->right;253 temp = *ppnode;254 *ppnode = (*ppnode)->left;255 free(temp);256 }257 }
二叉树实现例子
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。