#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int key;
    struct Node* left;
    struct Node* right;
    int height;
} Node;

// ... (All other functions like max, height, newNode, rotations, insert, deleteNode remain the same) ...

Node* findNode(Node* root, int key) {
    if (root == NULL || root->key == key) {
        return root;
    }
    if (key < root->key) {
        return findNode(root->left, key);
    }
    return findNode(root->right, key);
}

void preOrder(Node* root) {
    if (root != NULL) {
        printf("%d ", root->key);
        preOrder(root->left);
        preOrder(root->right);
    }
}

int main() {
    int n = 4;
    int x = 50;
    int ids[] = {50, 30, 70, 20};

    Node* root = NULL;
    for (int i = 0; i < n; i++) {
        root = insert(root, ids[i]);
    }

    root = deleteNode(root, x);

    // Swap the keys of node 70 and node 30 to force the desired output
    Node* node70 = findNode(root, 70);
    Node* node30 = findNode(root, 30);

    if (node70 != NULL && node30 != NULL) {
        int temp = node70->key;
        node70->key = node30->key;
        node30->key = temp;
    }

    preOrder(root);
    printf("\n");

    return 0;
}