好吧,我已经有一段时间了......试图找出一种算法,将我的随机数列表插入到二叉树中。
这是我到目前为止所得到的:
NodePtr和Tree是指向节点的指针
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),但如果列表较大,则会出现不平衡和错误。
答案 0 :(得分:1)
它是否意味着成为搜索树?我没有看到任何if (value < T->Value)
条件。
你有一个InsertNull(未显示)。这不应该是必要的,1个功能就足够了。
要解决您的主要问题,请使用指针指针参数,或者更优雅,始终返回一个新树:
//untested, no balancing
Tree InsertValue(Tree t, int value)
{
if (t == null)
t = // create and return new node
else
{
if (value < t->Value)
t->Left = InsertValue(t->Left, value);
else
t->Right = InsertValue(t->Left, value);
}
return t;
}
在CreateTree中:
Tree t = InsertValue(null, in);
答案 1 :(得分:1)
由于赋值不适用于已排序的树,因此可以以广度优先的方式填充它。这意味着插入的第一个东西始终是根,下一个是下一个级别的第一个节点,所以它看起来像这样:
0
1 2
3 4 5 6
这是一篇进一步解释的文章:
答案 2 :(得分:0)
在二叉树中简单插入并保持二叉树平衡是不同的问题。我建议你从第一个问题开始,只关注在树中保持订单属性的正确性。你离这不远了。
然后你应该看看红黑树的经典实现,经过充分研究和保持树木平衡的有效方法,但是花费更多,它会更复杂。