Upload files to "DS/C/Lab/Week11"
This commit is contained in:
parent
2a9ea110f0
commit
448b21d0ed
125
DS/C/Lab/Week11/expression.c
Normal file
125
DS/C/Lab/Week11/expression.c
Normal file
@ -0,0 +1,125 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include<stdbool.h>
|
||||
#include<ctype.h>
|
||||
#include<string.h>
|
||||
#define MAX 100
|
||||
|
||||
typedef struct TNode *Tptr;
|
||||
typedef struct TNode
|
||||
{
|
||||
char data;
|
||||
Tptr leftchild;
|
||||
Tptr rightchild;
|
||||
}TNode;
|
||||
///*
|
||||
//Create nodes in the tree
|
||||
Tptr createNode(char val)
|
||||
{
|
||||
Tptr temp =(Tptr)malloc(sizeof(TNode));
|
||||
temp->data = val;
|
||||
temp->leftchild = temp->rightchild = NULL;
|
||||
return temp;
|
||||
}
|
||||
//*/
|
||||
|
||||
Tptr stack[MAX];
|
||||
int top=-1;
|
||||
int i;
|
||||
|
||||
//check if stack is empty
|
||||
bool isEmpty()
|
||||
{
|
||||
return top==-1;
|
||||
}
|
||||
|
||||
//check if stack is full
|
||||
bool isFull()
|
||||
{
|
||||
return top==MAX -1;
|
||||
}
|
||||
|
||||
//push element onto stack
|
||||
void Push(Tptr e)
|
||||
{
|
||||
if(isFull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
stack[++top]=e;
|
||||
}
|
||||
|
||||
//pop element from stack
|
||||
Tptr Pop()
|
||||
{
|
||||
Tptr popped=createNode('\0');
|
||||
if(isEmpty())
|
||||
{
|
||||
free(popped);
|
||||
}
|
||||
else
|
||||
{
|
||||
popped=stack[top--];
|
||||
}
|
||||
return popped;
|
||||
}
|
||||
|
||||
//check if character is operator
|
||||
bool isOperator(char ch)
|
||||
{
|
||||
bool ret=false;
|
||||
if(ch=='*' || ch=='/' || ch=='+' || ch=='-' || ch=='^' )
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Tptr createExpression(char* postfix)
|
||||
{
|
||||
int i;
|
||||
int plen =strlen(postfix);
|
||||
char cc;
|
||||
for(i=0;i<plen;i++)
|
||||
{
|
||||
cc = postfix[i];
|
||||
if(isalnum(cc))
|
||||
{
|
||||
Tptr node = createNode(cc);
|
||||
Push(node);
|
||||
}
|
||||
else if(isOperator(cc))
|
||||
{
|
||||
Tptr node = createNode(cc);
|
||||
node->rightchild = Pop();
|
||||
node->leftchild = Pop();
|
||||
Push(node);
|
||||
}
|
||||
}
|
||||
return stack[top];
|
||||
}
|
||||
|
||||
void inOrderTraversal(Tptr root)
|
||||
{
|
||||
if (root != NULL)
|
||||
{
|
||||
inOrderTraversal(root->leftchild);
|
||||
printf("%c ", root->data);
|
||||
inOrderTraversal(root->rightchild);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
char postfix[] = "ab*cd/-";
|
||||
Tptr expressionTree = createExpression(postfix);
|
||||
|
||||
if (expressionTree != NULL)
|
||||
{
|
||||
printf("In-Order Traversal of the Expression Tree: ");
|
||||
inOrderTraversal(expressionTree);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
135
DS/C/Lab/Week11/levelOrder.c
Normal file
135
DS/C/Lab/Week11/levelOrder.c
Normal file
@ -0,0 +1,135 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#define MAX 100
|
||||
|
||||
typedef struct TNode *Tptr;
|
||||
typedef struct TNode {
|
||||
int data;
|
||||
Tptr leftchild;
|
||||
Tptr rightchild;
|
||||
} TNode;
|
||||
|
||||
typedef struct {
|
||||
Tptr key;
|
||||
} element;
|
||||
|
||||
element Q[MAX];
|
||||
int r = -1;
|
||||
int f = -1;
|
||||
|
||||
element dequeue() {
|
||||
element ret = {NULL};
|
||||
if (f != r) {
|
||||
f++;
|
||||
ret = Q[f];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void enqueue(element e) {
|
||||
if (r < MAX - 1) { // Check if the queue is not full
|
||||
r++;
|
||||
Q[r] = e;
|
||||
} else {
|
||||
printf("Queue is full\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Create nodes in the tree
|
||||
Tptr createNode(int val) {
|
||||
Tptr temp = (Tptr)malloc(sizeof(TNode));
|
||||
if (temp) {
|
||||
temp->data = val;
|
||||
temp->leftchild = temp->rightchild = NULL;
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
// Create the binary search tree
|
||||
void createBST(Tptr *root) {
|
||||
int N, i, val;
|
||||
Tptr current, previous;
|
||||
|
||||
printf("Enter the number of nodes: ");
|
||||
scanf("%d", &N);
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
printf("Enter a unique value: ");
|
||||
scanf("%d", &val);
|
||||
|
||||
Tptr temp = createNode(val);
|
||||
if (!temp) {
|
||||
printf("Memory allocation failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!*root) {
|
||||
*root = temp;
|
||||
} else {
|
||||
current = *root;
|
||||
previous = NULL;
|
||||
int isDuplicate = 0; // Flag for duplicate
|
||||
|
||||
while (current) {
|
||||
previous = current;
|
||||
if (val < current->data) {
|
||||
current = current->leftchild;
|
||||
} else if (val > current->data) {
|
||||
current = current->rightchild;
|
||||
} else {
|
||||
printf("Duplicate. Will only be printed for first occurence.\n");
|
||||
isDuplicate = 1; // Set flag if duplicate found
|
||||
break; // Exit loop
|
||||
}
|
||||
}
|
||||
|
||||
if (!isDuplicate) {
|
||||
if (val < previous->data) {
|
||||
previous->leftchild = temp;
|
||||
} else {
|
||||
previous->rightchild = temp;
|
||||
}
|
||||
} else {
|
||||
free(temp); // Free memory for duplicate node
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Print in level order
|
||||
void levelOrderTraversal(Tptr current) {
|
||||
if (current == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
element b;
|
||||
b.key = current;
|
||||
enqueue(b);
|
||||
|
||||
while (f != r) { // While the queue is not empty
|
||||
Tptr currentNode = dequeue().key;
|
||||
printf("%d ", currentNode->data);
|
||||
|
||||
if (currentNode->leftchild != NULL) {
|
||||
b.key = currentNode->leftchild;
|
||||
enqueue(b);
|
||||
}
|
||||
|
||||
if (currentNode->rightchild != NULL) {
|
||||
b.key = currentNode->rightchild;
|
||||
enqueue(b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
Tptr root = NULL;
|
||||
|
||||
createBST(&root);
|
||||
|
||||
printf("Level Order Traversal: ");
|
||||
levelOrderTraversal(root);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user