//We will do following Functions:
1. lookup
2. Insert
3. printTree,printPost, printPre
4. Selection Function
5. Delete(Hence implemented - child0,child1,child2, inorder2 functions)
1. lookup
2. Insert
3. printTree,printPost, printPre
4. Selection Function
5. Delete(Hence implemented - child0,child1,child2, inorder2 functions)
Let us know the feedback.#ifndef TREE1_H#define TREE1_H# include <stdio.h># include <stdlib.h>#define isChildless(p) p->left==NULL &&p->right==NULLenum BOOL{false,true} ;typedef enum BOOL BOOL;struct node {int data;struct node* left;struct node* right;} ;typedef struct node node;/*Given a binary tree, return true if a nodewith the target data is found in the tree. Recursdown the tree, chooses the left or rightbranch by comparing the target to each node.*/static int lookup(node* node, int target) {// 1. Base case == empty tree// in that case, the target is not found so return falseif (node == NULL) {return(false);}else {// 2. see if found hereif (target == node->data) return(true);else {// 3. otherwise recur down the correct subtreeif (target <>data) return(lookup(node->left, target));else return(lookup(node->right, target));}}}node* newNode(int data) {node* temp = (node*) malloc(sizeof(node)); // "new" is like "malloc"temp->data = data;temp->left = NULL;temp->right = NULL;return(temp);}/*Give a binary search tree and a number, inserts a new nodewith the given number in the correct place in the tree.Returns the new root pointer which the caller shouldthen use (the standard trick to avoid using referenceparameters).*/struct node* insert(struct node* node, int data) {// 1. If the tree is empty, return a new, single nodeif (node == NULL) {return(newNode(data));}else {// 2. Otherwise, recur down the treeif (data <= node->data) node->left = insert(node->left, data);else node->right = insert(node->right, data);return(node); // return the (unchanged) node pointer}}//functions simply on traversalsint size(node *p){if (p==NULL) {return(0);} else {return(size(p->left) + 1 + size(p->right));}}/*Given a binary search tree, print outits data elements in increasingsorted order.*/void printTree(struct node* node) {if (node == NULL) {//printf("check");return;}printTree(node->left);printf("%d <<", node->data);printTree(node->right);}void printPostTree(node *node){if (node == NULL) return;printPostTree(node->left);//note here even printTree will workprintPostTree(node->right);printf("%d ", node->data);}/*The node to be deleted might be in the following states* The node does not exist in the tree - In this case you have nothing to delete.* The node to be deleted has no children - The memory occupied by this node mustbe freed and either the left link or the right link of the parent of this node must be set to NULL.* The node to be deleted has exactly one child -We have to adjust the pointer of the parent of the node to be deleted such thatafter deletion it points to the child of the node being deleted.* The node to be deleted has two children -We need to find the inorder successor of the node to be deleted.The data of the inorder successor must be copied into the node to be deleted and a pointer shouldbe setup to the inorder successor. This inorder successor would have one or zero children.This node should be deleted using the same procedure as for deleting a one child or a zero child node.Thus the whole logic of deleting a node with two children is to locate the inorder successor,copy its data and reduce the problem to a simple deletion of a node with one or zero children.*/int select(){int selection;do{puts("");puts("Enter 1: Insert a node in the BST");puts("Enter 2: Delete");puts("Enter 3: Display(preorder)the BST");puts("Enter 4: Display(inorder)the BST");puts("Enter 5: Display(postorder) the BST");puts("Enter 6: Print");puts("Enter 7: Lookup");puts("Enter 9: End");puts("Enter your choice");scanf("%d",&selection);if((selection<1)||(selection>7)){puts("wrong choice:Try again");getch(); }}while((selection<1)||(selection>7));return (selection);}node *getInorder2Child(node *n)//returns inorder succesor only when parent has //right node{if( n->right==0 ) return 0;n = n->right;while( n->left != 0 )n = n->left;return n;}node *child0(node *p, node **parent,int rt,int lt){node *parentP = *parent;if(rt==1) parentP->right = NULL;else if(lt==1) parentP->left = NULL;//retNode = p;//free(p);//free only when u dont want to return the node and adjust return type accordinglyreturn p;}node *child_1(node *p, node **parent, int rt,int lt){node *parentP = *parent;if(p->left==NULL && p->right!=NULL){if(rt==1) parentP->right = p->right;else parentP->left = p->right;}if(p->left!=NULL&&p->right==NULL){if(rt==1) parentP->right = p->left;else parentP->left = p->left;}}node * deleteNode(node **root,int num){int lt=0,rt=0,inorderData;node *p = *root,*parentP=*root;node *retNode;node *inordersucc;if(!lookup(*root,num)) {printf("node not found\n");return (node*) 0;}//if node to be deleted has no childwhile(p->data!=num){if(p->data > num) { parentP=p; p=p->left; lt=1;rt=0;}else if(p->dataright; lt=0;rt=1;}}if(isChildless(p)){p = child0(p,&parentP,rt,lt);return p;}//only 1 child to be deletedif((p->left==NULL && p->right!=NULL)||(p->left!=NULL&&p->right==NULL)){p=child_1(p,&parentP,rt,lt);return p;}if(p->left!= NULL && p->right != NULL){inordersucc = getInorder2Child(p);// printf("%d\n" , inordersucc->data);//swap teh values// swaptemp = num;//though swaptemp is useless variable, because we already have nump->data = inordersucc->data;//inordersucc->data = num;//printf("%d\n",inordersucc->data);retNode = deleteNode(&p->right,inordersucc->data);}return (node*) NULL;}#endif







0 comments:
Post a Comment