Ну, я был на это некоторое время ... пытаясь найти алгоритм для вставки моего списка случайных чисел в двоичное дерево.Помогите вставить список значений в двоичное дерево ..?
Это то, что я получил до сих пор:
NodePtr и дерево являются указателями на узел
NodePtr CreateTree(FILE * fpData)
{
int in;
fscanf(fpData, "%i", &in);
Tree T = (NodePtr)malloc(sizeof(Node));
T->Left = NULL;
T->Right = NULL;
T->value = in;
while((fscanf(fpData, "%i", &in)) != EOF)
{
InsertInTree(in, T);
printf("\n %p", T);
}
return T;
}
void InsertInTree(int value,Tree T)
{
if(T == NULL)
{
T->Left = (NodePtr)malloc(sizeof(Node));
T->Left->Left = NULL;
T->Left->Right = NULL;
T->Left->value = value;
printf("\n %i ", value);
return;
}
if(T->Left == NULL)
{
InsertInNull(value, T->Left);
}
else if(T->Right == NULL)
{
InsertInNull(value, T->Right);
}
else
{
if(T->Left->Left == NULL || T->Left->Right == NULL) InsertInTree(value, T->Left);
else InsertInTree(value, T->Right);
}
}
Я потерял от того, что делать, если оба потомка конкретного узла не являются ноль. То, что я сделал здесь, работает для небольшого количества чисел (1,2,3,5,6), но если список больше, он становится неуравновешенным и неправильным.
Какова цель этого двоичного дерева? Например, в двоичном дереве поиска в каждом узле вы сравниваете значение, которое вы вставляете в значение в узле. Если это меньше (или равно, ради аргумента), то значение вы проверяете левым поддеревом. Если это больше, вы проверяете право. Каждый раз, когда вы пытаетесь проверить пустое поддерево, вы создаете новый листовой узел и присваиваете ему значение, которое вы вставляете. Вы, кажется, всегда будете идти, какой бы путь в настоящее время не заселен? – Tommy
Ваши варианты - либо перебалансировать себя. Или использовать многообразный алгоритм, подобный [Red-Black tree] [1], который автоматически перебалансирует. [1]: http://en.wikipedia.org/wiki/Red-black_tree – Wolph
Думаю, я знаю, что мне нужно делать сейчас .... Возможно, я неправильно понял, что я думаю с этим двоичным деревом. Мне нужно заказать его. Всем спасибо. – Bri