/* * Two BST are given find common elements in both * Algo works like this: * Iteratively traverse both the tree in inorder fashion * If the first tree node is less than the second tree move the * first tree forward else if the second tree node is less than the * first tree move second tree forward. If equal move both tree forward * Do this operation till either one of the tree is complete. * */ void CommonElementsInBST(TreeNode* root1, TreeNode* root2) { Stack *stack1 = createStack(); Stack *stack2 = createStack(); int commonElementCount = 0; do { while (root1 != NULL ) { push(stack1, root1); root1 = root1->left; } while (root2 != NULL ) { push(stack2, root2); root2 = root2->left; } if (isEmpty(stack1) != 0 && isEmpty(stack2)) { root1 = (TreeNode*)top(stack1); root2 = (TreeNode*)top(stack2); if (*((int*)root1->object) < *((int*)root2->object)) { pop(stack1); root1 = root1->right; } else if (*((int*)root1->object) > *((int*)root2->object)) { pop(stack2); root2 = root2->right; } else { pop(stack1); pop(stack2); printf("%d ", *((int*) root1->object)); root1 = root1->right; root2 = root2->right; commonElementCount++; } } } while (((isEmpty(stack1) != 0) || root1 != NULL) && ((isEmpty(stack2) != 0) || root1 != NULL)); printf("Number of common elements are : %d", commonElementCount); }
Sunday, September 23, 2012
Find common elements in given two Binary Search Trees
Sunday, September 9, 2012
Stack Operations
Stack create, push, pop, empty operations
typedef struct _stack { int top; void* array[20]; } Stack; Stack* createStack() { Stack *stack = malloc(sizeof(Stack)); memset(stack, 0, sizeof(Stack)); return stack; } void push(Stack* stack, void* elem) { stack->array[stack->top] = elem; stack->top += 1; } void* pop(Stack* stack) { void* elem = stack->array[stack->top-1]; stack->top -= 1; return elem; } void* top(Stack* stack) { if (stack->top == 0) return NULL; return stack->array[stack->top-1]; } int isEmpty(Stack* stack) { return stack->top; }
Inorder Traversal of binary tree
Inorder traversal of binary tree - Recursive
Inorder traversal of binary tree - Iterative
typedef struct _binaryTreeNode { struct _binaryTreeNode *left; struct _binaryTreeNode *right; void* object; } TreeNode; void inOrderTraversalRecursive(TreeNode* root) { if (root == NULL ) return; inOrderTraversalRecursive(root->left); printf("%d ", *(int *) root->object); inOrderTraversalRecursive(root->right); }
Inorder traversal of binary tree - Iterative
void inOrderTraversalIterative(TreeNode* root) { if (root == NULL ) return; Stack *tempStack = createStack(); do { while (root != NULL ) { push(tempStack, root); root = root->left; } if (isEmpty(tempStack) != 0) { root = pop(tempStack); printf("%d ", *((int*) root->object)); root = root->right; } } while ((isEmpty(tempStack) != 0) || root != NULL ); }PS: Stack related functions are here.
Mirror a Binary Tree
Following algorithm would create a mirror of a Tree
void mirror(TreeNode* root) { if (root == NULL ) return; TreeNode* temp = root->left; root->left = root->right; root->right = temp; mirror(root->left); mirror(root->right); }
Tuesday, September 4, 2012
Removing consecutive Zeros
/*Remove all two consecutive zeros in the given string.
Example: a3409jd00dk000d
Output: a3409jddk000d
Note: If there are less/more than two consecutive zeros, they should not be replaced.
*/
void remove2zeros(char *input) { char *temp = input; while (*temp != '\0') { if (*temp == '0' && *(temp - 1) != '0' && *(temp + 1) == '0' && *(temp + 2) != '0') { temp = temp + 2; } else { if (input != temp) { *input++ = *temp++; } else { temp++; input++; } } } *input = '\0'; }
Subscribe to:
Posts (Atom)