Недостаточно информации о том, как именно это должно работать (например, node.lbit
).
Функция insert()
вопроса не будет работать.Он передает значение, которое немедленно перезаписывается (среди других вопросов).Там нет объяснения того, для чего tree.head
, поэтому он игнорируется.Поля node.lbit
и node.rbit
выглядят как лишние флаги node.left != NULL
(аналогично справа).Они тоже опущены.insert()
также не создает дерево должным образом.
void insert(int value) // Insert a value into the tree (at branch)
{
// Create a new node to insert
struct node *temp = createnode(value);
if (root == NULL) // Checking if tree is empty
{
root = temp; //Root now points to temp
}
else
{
insertAtBranch(root, temp);
}
}
// recursively find the leaf-node at which to insert the new node
void insertAtBranch(node *branch, node *new_node)
{
// to create a BST, less-than go left
if (new_node->value <= branch->value)
{
if (branch->left == NULL)
branch->left = new_node; // There's no left-branch, so it's the node
else
insertAtBranch(branch->left, new_node); // go deeper to find insertion point
}
else // greater-than go right
{
if (branch->right == NULL)
branch->right = new_node;
else
insertAtBranch(branch->right, new_node);
}
}
Представьте, как работает двоичное дерево.Новые узлы вставляются только по краям.Итак, вы смотрите на данный узел и решаете, является ли этот новый узел меньше или больше, чем тот, на который вы смотрите (конечно, если дерево не пусто).
Скажите, что new-node.value
меньше, чем branch-node.value
, вы хотите перейти влево.Тем не менее, с тем же узлом, если у него нет левой ветви (node.left == NULL)
, новый узел будет левой веткой.В противном случае вам нужно пройти вниз по левой ветви и проверить еще раз.
Я бы сделал node
классом и использовал бы конструктор, чтобы хотя бы установить свойства по умолчанию и value
.Но это не имеет большого значения.