帮助将值列表插入二叉树..?

时间:2010-11-07 23:05:20

标签: c tree binary-tree

好吧,我已经有一段时间了......试图找出一种算法,将我的随机数列表插入到二叉树中。

这是我到目前为止所得到的:

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),但如果列表较大,则会出现不平衡和错误。

3 个答案:

答案 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

这是一篇进一步解释的文章:

http://www.cs.bu.edu/teaching/c/tree/breadth-first/

答案 2 :(得分:0)

在二叉树中简单插入并保持二叉树平衡是不同的问题。我建议你从第一个问题开始,只关注在树中保持订单属性的正确性。你离这不远了。

然后你应该看看红黑树的经典实现,经过充分研究和保持树木平衡的有效方法,但是花费更多,它会更复杂。