【问题标题】:Help inserting a list of values into a binary tree..?帮助将值列表插入二叉树..?
【发布时间】:2010-11-08 09:01:37
【问题描述】:

嗯,我已经研究了一段时间...试图找出一种算法来将我的随机数列表插入二叉树。

这是我目前得到的:

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),但如果列表更大,它就会变得不平衡和错误。

【问题讨论】:

  • 这个二叉树的目的是什么?例如,在二叉搜索树中,在每个节点处,您将插入的值与节点处的值进行比较。如果它小于(或等于)您检查左子树的值。如果它更大,你检查的权利。每当您尝试检查一个空的子树时,您都会创建一个新的叶节点并为其提供您要插入的值。你似乎总是走目前没有人的那条路?
  • 您的选择是重新平衡自己。或者使用稍微不同的算法,例如自动重新平衡的 [红黑树][1]。 [1]:en.wikipedia.org/wiki/Red-black_tree
  • 我想我知道我现在需要做什么......我可能误解了我对这棵二叉树的假设。我需要订购它。谢谢大家。

标签: c tree binary-tree


【解决方案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);

【讨论】:

  • 变量old是什么?你的意思是 t 吗?
  • 所以,我试过这个......但如果我有一些已经排序的东西......像 1,2,3,4,5,6 它只是将它们链接在一起......我如何将它放入喜欢二叉树...:\
  • @Bri:你想要的是一个平衡的二叉搜索树,它比简单的二叉搜索树更具挑战性。请参阅en.wikipedia.org/wiki/Balanced_binary_search_tree 以获取用于平衡二叉搜索树的多种不同算法的链接。
  • 哎呀,我真的要放弃我的计算机科学学位了...我会检查一下...(我真的为此流泪了...)跨度>
  • 如果这是为了上课,请再次检查作业。大多数 CS 学生需要写的第一棵树不是自平衡树。通过编写不平衡二叉树来了解基础知识,然后您将为平衡树(可能是 AVR 树)奠定适当的基础。就像生活中的其他事情一样,编程是一个渐进的过程。一步一步走,你会没事的。不要放弃。
【解决方案2】:

由于分配不是针对排序树的,因此您可以以广度优先的方式填充它。这意味着插入的第一件事总是根,下一个是下一级的第一个节点,所以它看起来像这样:

   0
  1 2
3 4 5 6

这里有一篇文章进一步解释:

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

【讨论】:

  • 知道如何编写以该格式插入数字列表的代码吗?
  • 通常使用数组作为存储,使用 div/mult 在父母和孩子之间导航。我想出了一个使用指针的方案,但结果太做作了。你真的应该和你的导师谈谈,以获得更清晰的问题定义。我猜它是一个排序树,问题的措辞很糟糕。在我辅导的 CS 课中,我们写了一个不平衡的排序树,并使用 pre、post 和 mid 遍历来打印树的内容(不是 find 函数)。对于 CS 老师来说,分配其他任何东西似乎都很奇怪。
【解决方案3】:

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

那么你应该看看红黑树的经典实现,这是一种经过充分研究和有效的保持树平衡的方法,但要付出代价,它更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多