#include <iostream>
using namespace std;
// A node in 2-3-4 tree
struct Node {
int keys[3]; // Maximum of 3 keys
Node* children[4]; // Maximum of 4 children
int nKeys; // Number of keys in the node
bool isLeaf; // Leaf indicator
Node(bool leaf) {
isLeaf = leaf;
nKeys = 0;
for (int i = 0; i < 4; i++)
children[i] = nullptr;
}
};
// Search a key in a 2-3-4 tree
bool search(Node* root, int key) {
if (!root) return false;
int i = 0;
while (i < root->nKeys && key > root->keys[i])
i++;
if (i < root->nKeys && root->keys[i] == key)
return true;
return (root->isLeaf) ? false : search(root->children[i], key);
}
// Insert non-full helper
void insertNonFull(Node* node, int key) {
int i = node->nKeys - 1;
if (node->isLeaf) {
while (i >= 0 && node->keys[i] > key) {
node->keys[i + 1] = node->keys[i];
i--;
}
node->keys[i + 1] = key;
node->nKeys++;
} else {
while (i >= 0 && node->keys[i] > key)
i--;
i++;
if (node->children[i]->nKeys == 3) {
int mid = node->children[i]->keys[1];
Node* leftChild = new Node(node->children[i]->isLeaf);
Node* rightChild = new Node(node->children[i]->isLeaf);
leftChild->keys[0] = node->children[i]->keys[0];
leftChild->nKeys = 1;
rightChild->keys[0] = node->children[i]->keys[2];
rightChild->nKeys = 1;
for (int j = node->nKeys; j > i; j--) {
node->keys[j] = node->keys[j - 1];
node->children[j + 1] = node->children[j];
}
node->keys[i] = mid;
node->children[i] = leftChild;
node->children[i + 1] = rightChild;
node->nKeys++;
if (key < node->keys[i])
insertNonFull(leftChild, key);
else
insertNonFull(rightChild, key);
} else {
insertNonFull(node->children[i], key);
}
}
}
// Main insert function
void insert(Node*& root, int key) {
if (!root) {
root = new Node(true);
root->keys[0] = key;
root->nKeys = 1;
} else {
if (root->nKeys == 3) {
Node* newRoot = new Node(false);
newRoot->children[0] = root;
insertNonFull(newRoot, key);
root = newRoot;
} else {
insertNonFull(root, key);
}
}
}
// Inorder traversal (sorted output)
void traverse(Node* root) {
if (!root) return;
int i;
for (i = 0; i < root->nKeys; i++) {
traverse(root->children[i]);
cout << root->keys[i] << " ";
}
traverse(root->children[i]);
}
int main() {
Node* root = nullptr;
int keys[] = {10, 20, 30, 40, 50, 60};
for (int key : keys)
insert(root, key);
cout << "Inorder traversal: ";
traverse(root);
cout << endl;
cout << "Search 30: " << (search(root, 30) ? "Found" : "Not Found") << endl;
return 0;
}