#include

#include

typedef struct Node {

int data;

struct Node* left;

struct Node* right;

} Node;

Node* createNode(int data) {

Node* newNode = (Node*)malloc(sizeof(Node));

if (!newNode) {

printf("Memory errorn");

return NULL;

}

newNode->data = data;

newNode->left = NULL;

newNode->right = NULL;

return newNode;

}

Node* insertNode(Node* root, int data) {

if (root == NULL) {

root = createNode(data);

return root;

}

if (data < root->data) {

root->left = insertNode(root->left, data);

} else {

root->right = insertNode(root->right, data);

}

return root;

}

void preorderTraversal(Node* root) {

if (root == NULL) return;

printf("%d ", root->data);

preorderTraversal(root->left);

preorderTraversal(root->right);

}

void inorderTraversal(Node* root) {

if (root == NULL) return;

inorderTraversal(root->left);

printf("%d ", root->data);

inorderTraversal(root->right);

}

void postorderTraversal(Node* root) {

if (root == NULL) return;

postorderTraversal(root->left);

postorderTraversal(root->right);

printf("%d ", root->data);

}

Node* searchNode(Node* root, int data) {

if (root == NULL || root->data == data)

return root;

if (data < root->data)

return searchNode(root->left, data);

else

return searchNode(root->right, data);

}

Node* deleteNode(Node* root, int data) {

if (root == NULL) return root;

if (data < root->data) {

root->left = deleteNode(root->left, data);

} else if (data > root->data) {

root->right = deleteNode(root->right, data);

} else {

if (root->left == NULL) {

Node* temp = root->right;

free(root);

return temp;

} else if (root->right == NULL) {

Node* temp = root->left;

free(root);

return temp;

}

Node* temp = minValueNode(root->right);

root->data = temp->data;

root->right = deleteNode(root->right, temp->data);

}

return root;

}

Node* minValueNode(Node* node) {

Node* current = node;

while (current && current->left != NULL)

current = current->left;

return current;

}

int height(Node* root) {

if (root == NULL) return 0;

int leftHeight = height(root->left);

int rightHeight = height(root->right);

return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;

}

int main() {

Node* root = NULL;

root = insertNode(root, 50);

insertNode(root, 30);

insertNode(root, 20);

insertNode(root, 40);

insertNode(root, 70);

insertNode(root, 60);

insertNode(root, 80);

printf("Preorder traversal: ");

preorderTraversal(root);

printf("n");

printf("Inorder traversal: ");

inorderTraversal(root);

printf("n");

printf("Postorder traversal: ");

postorderTraversal(root);

printf("n");

printf("Height of tree: %dn", height(root));

root = deleteNode(root, 20);

printf("Inorder traversal after deletion of 20: ");

inorderTraversal(root);

printf("n");

return 0;

}