www.pudn.com > HEC-win32.zip > tree.cpp
#include#include /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + declarations + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct BiNode { int value; struct BiNode *left; struct BiNode *right; }; class BinarySearchTree { public: struct BiNode *root_ptr; void insertNode(struct BiNode **link, int val); struct BiNode* findNode(struct BiNode *link, int val); struct BiNode* deleteSmallestNode(struct BiNode **link); void deleteNode(struct BiNode **link, int val); void deleteAll(struct BiNode **link); void printTree(struct BiNode *link, int level); int getHeight(struct BiNode *link); }; /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + definitions + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* given struct Binode **link link = address of a variable which holds the address of the node *link = address of the node **link = node */ void BinarySearchTree::insertNode(struct BiNode **link, int val) { if( *link==NULL ) { (*link) = (struct BiNode*)malloc(sizeof(struct BiNode)); (*(*link)).value = val; (*(*link)).left = NULL; (*(*link)).right = NULL; printf("insertNode(): inserting %d\n",val); } else if( val < (*(*link)).value) { printf("insertNode(): moving left\n",val); insertNode(&((*(*link)).left),val); } else { printf("insertNode(): moving right\n",val); insertNode(&((*(*link)).right),val); } return; }/*end insertNode*/ /*-----------------------------------------------------------------*/ struct BiNode* BinarySearchTree::findNode(struct BiNode *link, int val) { if(link==NULL) { return(NULL); } else if((*link).value == val) { return(link); } else if(val >= (*link).value) { return(findNode((*link).right,val)); } else { return(findNode((*link).left,val)); } }/*end findNode*/ /*-----------------------------------------------------------------*/ struct BiNode* BinarySearchTree::deleteSmallestNode(struct BiNode **link) { if((*(*link)).left != NULL) { return(deleteSmallestNode(&((*(*link)).left))); } else { struct BiNode *temp; temp = *link; (*link) = (*(*link)).right; return(temp); } }/*end deleteSmallestNode*/ /*-----------------------------------------------------------------*/ void BinarySearchTree::deleteNode(struct BiNode **link, int val) { if( (*link)==NULL ){ printf("deleteNode(): %d does not exist\n",val); return; } if(val < (*(*link)).value) { deleteNode(&((*(*link)).left),val); } else if(val > (*(*link)).value) { deleteNode(&((*(*link)).right),val); } else { /* have equality 3 cases i) node has no children ( just delete it ) ii) node has one child ( set parent of current node to child of current node, delete current node ) iii) node has two children/subtrees In the third case, get smallest/leftmost node in right subtree of current node. Then delete the leftmost node and place it's value in the current node ( retain binary tree properties ) */ struct BiNode *temp; temp = *link; if((*(*link)).right==NULL) { (*link) = (*(*link)).left; } else if((*(*link)).left==NULL) { (*link) = (*(*link)).right; } else { temp = deleteSmallestNode(&((*(*link)).right)); (*(*link)).value = (*temp).value; } printf("deleteNode(): freeing %d\n",val); free(temp); } return; }/*end deleteNode*/ /*-----------------------------------------------------------------*/ void BinarySearchTree::deleteAll(struct BiNode **link) { if((*link)==NULL) { return; } deleteAll(&((*(*link)).left)); deleteAll(&((*(*link)).right)); printf("deleteAll(): freeing %d\n",(*(*link)).value); free((*link)); *link=NULL; return; }/*end deleteAll*/ /*-----------------------------------------------------------------*/ void BinarySearchTree::printTree(struct BiNode *link, int level) { int i; if(link==NULL) { return; } printTree((*link).right,level+1); for(i=0;i v){ return(u+1); } else{ return(v+1); } }/*end getHeight*/ /*-----------------------------------------------------------------*/ void main() { BinarySearchTree bst; bst.root_ptr=NULL; bst.insertNode(&(bst.root_ptr),15); bst.insertNode(&(bst.root_ptr),20); bst.insertNode(&(bst.root_ptr),7); bst.insertNode(&(bst.root_ptr),17); bst.insertNode(&(bst.root_ptr),25); bst.insertNode(&(bst.root_ptr),2); bst.insertNode(&(bst.root_ptr),30); bst.insertNode(&(bst.root_ptr),1); bst.insertNode(&(bst.root_ptr),7); printf("height=%d\n",bst.getHeight(bst.root_ptr)); bst.printTree(bst.root_ptr,0); bst.deleteNode(&(bst.root_ptr),20); printf("height=%d\n",bst.getHeight(bst.root_ptr)); bst.printTree(bst.root_ptr,0); bst.deleteNode(&(bst.root_ptr),2); printf("height=%d\n",bst.getHeight(bst.root_ptr)); bst.printTree(bst.root_ptr,0); bst.deleteNode(&(bst.root_ptr),13); printf("height=%d\n",bst.getHeight(bst.root_ptr)); bst.printTree(bst.root_ptr,0); if((bst.findNode(bst.root_ptr,17))!=NULL){ printf("found 17\n"); } else{ printf("could NOT find 17\n"); } if((bst.findNode(bst.root_ptr,8))!=NULL){ printf("found 8\n"); } else{ printf("could NOT find 8\n"); } bst.deleteAll(&(bst.root_ptr)); printf("height=%d\n",bst.getHeight(bst.root_ptr)); bst.printTree(bst.root_ptr,0); return; }/*end main*/