Если вы измените
else if (root-> right == NULL)
на
else
, то это будет иметь эффект постоянного добавления справа.
Если вы хотите, чтобы он выбирал случайным образом, добавьте вызов к srand
вне этой функции.
srand(time(NULL));
Затем в этой функции вызовите
else if (rand() > MAX_RAND / 2) {
root->right = insert(root->right, key);
} else {
root->left = insert(root->left, key);
}
в конце существующей структуры if
/ else
.
См. Также:
Если ваше дерево отслеживает свою высоту в каждом узле, вы можете добавить его после проверки на нольчто-то вроде
else if (root->left->height <= root->right->height) {
root->left = insert(root->left, key);
} else {
root->right = insert(root->right, key);
}
Это будет поддерживать дерево сбалансированным автоматически.Но для управления высотой требуется дополнительный код.Например,
root->height = 1 + ((root->left->height > root->right->height) ? root->left->height : root->right->height);
Я оставляю на ваше усмотрение, стоят ли эти дополнительные накладные расходы.
Люди, предлагающие использовать кучу, предлагают использовать индексы в качестве порядка.Это бесполезно как куча, но это создаст сбалансированное двоичное дерево.Таким образом, корневой узел будет первым вставленным, а самый последний - самым правым.