一、二叉树的定义
#ifndef _BTREE_H_ #define _BTREE_H_ typedef void BTree; typedef struct _tag_BTreeNode BTreeNode; struct _tag_BTreeNode { BTreeNode* left; BTreeNode* right; }; typedef unsigned long long BTPos; typedef void (BTree_printf)(BTreeNode*); BTree* BTree_Create(); void BTree_Destroy(BTree* tree); void BTree_Clear(BTree* tree); int BTree_Empty(BTree* tree); int BTree_Insert(BTree* tree,BTreeNode* node,BTPos pos,int count,int flag); BTreeNode* BTree_Delete(BTree* tree,BTPos pos,int count); BTreeNode* BTree_Get(BTree* tree,BTPos pos,int count); BTreeNode* BTree_Root(BTree* tree); int BTree_Height(BTree* tree); int BTree_Count(BTree* tree); int BTree_Degree(BTree* tree); void BTree_Display(BTree* tree,BTree_printf* pFunc,int gap,char div); #endif #include <stdio h=""> #include <malloc h=""> #include "BTree.h" #define BT_LEFT 0 #define BT_RIGHT 1 typedef struct _tag_BTree TBTree; struct _tag_BTree { BTreeNode* root; int count; }; static void recursive_display(BTreeNode* node,BTree_printf* pFunc,int format,int gap,char div) { int i = 0; if((node != NULL) && (pFunc != NULL)) { for(i=0;i<format i="" printf="" c="" div="" pfunc="" node="" printf="" n="" if="" node-="">left != NULL) || ( node->right != NULL)) { recursive_display(node->left,pFunc,format+gap,gap,div); recursive_display(node->right,pFunc,format+gap,gap,div); } } else { for(i=0;i<format i="" printf="" c="" div="" printf="" n="" static="" int="" recursive_count="" btreenode="" root="" int="" ret="0;" if="" root="" null="" ret="recursive_count(root-">left) + 1 + recursive_count(root->right); } return ret; } static int recursive_height(BTreeNode* root) { int ret = 0; if( root != NULL) { int lh = recursive_height(root->left); int rh = recursive_height(root->right); ret = ((lh >= rh) ? lh : rh) + 1; } return ret; } static int recursive_degree(BTreeNode* root) { int ret = 0; if(root != NULL) { if(root->left != NULL) { ret++; } if(root->right != NULL) { ret++; } if(ret == 1) { int lg = recursive_degree(root->left); int rg = recursive_degree(root->right); if(ret < lg) { ret = lg; } if( ret < rg) { ret = rg; } } } return ret; } BTree* BTree_Create() { TBTree* ret = (TBTree*)malloc(sizeof(TBTree)); if(ret != NULL) { ret->root = NULL; ret->count = 0; } return ret; } void BTree_Destroy(BTree* tree) { free(tree); } void BTree_Clear(BTree* tree) { TBTree* btree = (TBTree*)tree; if(btree != NULL) { btree->root = NULL; btree->count = 0; } } int BTree_Empty(BTree* tree) { TBTree* btree = (TBTree*)tree; int ret = 0; if((btree != NULL) && (btree->count == 0)) { ret = 1; } return ret; } int BTree_Insert(BTree* tree,BTreeNode* node,BTPos pos,int count,int flag) { TBTree* btree = (TBTree*)tree; if((btree != NULL) && (node != NULL) && (0 <= pos ) && ( 0 <= count) && ((flag ==0)||(flag == 1))) { BTreeNode* parent = NULL; BTreeNode* current = btree->root; node->left = NULL; node->right = NULL; int bit = 0; while((current != NULL) && (count != 0)) { bit = pos & 1; pos = pos >> 1; parent = current; if(bit == BT_LEFT) { current = current->left; } else if(bit == BT_RIGHT) { current = current->right; } count--; } if(flag == BT_LEFT) { node->left = current; } else if(flag == BT_RIGHT) { node->right = current; } if(parent != NULL) { if(bit == BT_LEFT) { parent->left = node; } else if(bit == BT_RIGHT) { parent->right = node; } } else { btree->root = node; } btree->count++; } } BTreeNode* BTree_Delete(BTree* tree,BTPos pos,int count) { TBTree* btree = (TBTree*)tree; BTreeNode* ret = NULL; if(btree != NULL) { BTreeNode* parent = NULL; BTreeNode* current = btree->root; int bit = 0; while((current != NULL) && (count != 0)) { bit = pos & 1; pos = pos >> 1; parent = current; if(bit == BT_LEFT) { current = current -> left; } else if(bit == BT_RIGHT) { current = current -> right; } count--; } if(parent != NULL) { if(bit == BT_LEFT) { parent->left = NULL; } else if(bit == BT_RIGHT) { parent->right = NULL; } } ret = current; btree->count = btree->count - recursive_count(ret); } return ret; } BTreeNode* BTree_Get(BTree* tree,BTPos pos,int count) { TBTree* btree = (TBTree*)tree; BTreeNode* ret = NULL; if((btree != NULL) && (0 <= pos) && (0 <= count)) { BTreeNode* current = btree->root; int bit = 0; while((current != NULL) && (count != 0)) { bit = pos & 1; pos = pos >> 1; if(bit == BT_LEFT) { current = current->left; } else if( bit == BT_RIGHT) { current = current->right; } count--; } ret = current; } return ret; } BTreeNode* BTree_Root(BTree* tree) { return BTree_Get(tree,0,0); } int BTree_Height(BTree* tree) { TBTree* btree = (TBTree*)tree; int ret = 0; if( btree != NULL) { ret = recursive_height(btree->root); } return ret; } int BTree_Count(BTree* tree) { TBTree* btree = (TBTree*)tree; int ret = 0; if(btree != NULL) { ret = recursive_count(btree->root); } return ret; } int BTree_Degree(BTree* tree) { TBTree* btree = (TBTree*)tree; int ret = 0; if(btree != NULL) { ret = recursive_degree(btree->root); } return ret; } void BTree_Display(BTree* tree,BTree_printf* pFunc,int gap,char div) { TBTree* btree = (TBTree*)tree; if((btree != NULL) && (pFunc != NULL)) { recursive_display(btree->root,pFunc,0,gap,div); } } <textarea style="WIDTH: 185px; HEIGHT: 128px" class="c++" rows="7" readonly="readonly" name="code"> #include <stdio h=""> #include <stdlib h=""> #include "BTree.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct _tag_value { BTreeNode header; char v; } DataElem; void printf_data(BTreeNode* node) { printf("%c",((DataElem*)node)->v); } int main(int argc, char *argv[]) { DataElem v1={{NULL,NULL},'A'}; DataElem v2={{NULL,NULL},'B'}; DataElem v3={{NULL,NULL},'C'}; DataElem v4={{NULL,NULL},'D'}; DataElem v5={{NULL,NULL},'E'}; DataElem v6={{NULL,NULL},'F'}; DataElem v7={{NULL,NULL},'G'}; DataElem v8={{NULL,NULL},'H'}; BTree* tree = BTree_Create(); BTree_Insert(tree,(BTreeNode*)&v1,0,0,0); BTree_Insert(tree,(BTreeNode*)&v2,0x00,1,0); BTree_Insert(tree,(BTreeNode*)&v3,0x01,1,0); BTree_Insert(tree,(BTreeNode*)&v4,0x00,2,0); BTree_Insert(tree,(BTreeNode*)&v5,0x02,2,0); BTree_Insert(tree,(BTreeNode*)&v6,0x02,3,0); BTree_Insert(tree,(BTreeNode*)&v7,0x06,3,0); BTree_Insert(tree,(BTreeNode*)&v8,0x00,3,0); printf("²åÈëÔªËØºó\n"); BTree_Display(tree,printf_data,4,'*'); printf("Ê÷µÄ½áµãÊý:\n"); printf("Ê÷µÄ½áµãÊýÊÇ%d\n",BTree_Count(tree)); printf("Ê÷µÄ¸ß¶È:\n"); printf("Ê÷µÄ¸ß¶ÈÊÇ%d\n",BTree_Height(tree)); printf("Ê÷µÄ¶È:\n"); printf("Ê÷µÄ¶ÈÊÇ%d\n",BTree_Degree(tree)); printf("Ê÷µÄ¸ù½áµãÔªËØÊÇ:\n"); printf("Ê÷µÄ¸ù½áµãÔªËØÊÇ%c\n",((DataElem*)BTree_Root(tree))->v); printf("Ê÷µÄµÚÈý¸öÔªËØÊÇ:\n"); printf("Ê÷µÄµÚÈý¸öÔªËØÊÇ%c\n",((DataElem*)BTree_Get(tree,0x00,2))->v); BTree_Delete(tree,0x00,3); printf("ɾ³ýÔªËØHºó\n"); BTree_Display(tree,printf_data,4,'*'); BTree_Delete(tree,0x02,2); printf("ɾ³ýÔªËØEºó\n"); BTree_Display(tree,printf_data,4,'*'); printf("Ê÷µÄ½áµãÊý:\n"); printf("Ê÷µÄ½áµãÊýÊÇ%d\n",BTree_Count(tree)); printf("Ê÷µÄ¸ß¶È:\n"); printf("Ê÷µÄ¸ß¶ÈÊÇ%d\n",BTree_Height(tree)); BTree_Delete(tree,0x01,1); printf("ɾ³ýÔªËØHºó\n"); BTree_Display(tree,printf_data,4,'*'); printf("Ê÷µÄ¶È:\n"); printf("Ê÷µÄ¶ÈÊÇ%d\n",BTree_Degree(tree)); BTree_Clear(tree); printf("Çå¿ÕÊ÷ºó\n"); BTree_Display(tree,printf_data,4,'*'); printf("Ê÷µÄ½áµãÊý:\n"); printf("Ê÷µÄ½áµãÊýÊÇ%d\n",BTree_Count(tree)); printf("Ê÷µÄ¸ß¶È:\n"); printf("Ê÷µÄ¸ß¶ÈÊÇ%d\n",BTree_Height(tree)); printf("Ê÷µÄ¶È:\n"); printf("Ê÷µÄ¶ÈÊÇ%d\n",BTree_Degree(tree)); BTree_Destroy(tree); return 0; } </stdlib></stdio>