【问题标题】:Searching a tree in c++(not binary)在 C++ 中搜索树(不是二进制)
【发布时间】:2013-04-29 05:45:25
【问题描述】:

我之前问过一个类似的问题,但现在我正在寻找为什么这不起作用而不是“帮我修复”。

我必须创建一个如下所示的通用树:

                       1
                       /
                      v
                      2->3->4
                     /      /  
                    v       v
                    5-6-7   8-9 

我用于类中所有其他方法的搜索方法是

gennode* general::search(int element, gennode *t){
  if(t == NULL)
  {
   return t;
  }
  if(t->item == element)
  {
  return t;
  }
  if(t->siblingList != NULL)
  {
  return search(element, t->siblingList)
  }
  return search(element, t->firstChild)
}

其中firstChild是图片中的垂直指针,siblingList是图片中的水平指针。

我的问题是它没有找到 5、6 或 7(2 的孩子)。

递归堆栈看起来像这样(至少我认为它应该在我的脑海中):

search(5, *1)
search(5, *2)
search(5, *3)
search(5, *4)
search(5, *8)
search(5, *9)
return NULL(from *9)
return NULL(from *8)
return NULL(from *3)
search(5, *5)
return(*5) the rest of the way up.

有人知道我在哪里迷路了吗?

【问题讨论】:

  • 只是一个猜测,我认为你应该有else ifs 而不是ifs。
  • 顺便说一下,它是一棵二叉树(每个节点有 2 个孩子),但它不是 ordered 二叉树。

标签: c++ search recursion tree tree-traversal


【解决方案1】:

您需要控制同级搜索中的NULL结果:

gennode* general::search(int element, gennode *t){
  if(t == NULL)
  {
    return t;
  }
  if(t->item == element)
  {
    return t;
  }
  gennode* result = NULL;
  if(t->siblingList != NULL)
  {
    result = search(element, t->siblingList)
  }
  if(result==NULL)
  {
    result = search(element, t->firstChild);
  }
  return result;
}

【讨论】:

  • 问题不在于先搜索什么。是不是,失败时,必须尝试其他方式。你解决了,因为你没有返回失败!
  • 这看起来应该是正确的方向,但是我在搜索 2 时遇到了段错误。
【解决方案2】:

你的问题在这里,它 t->siblingList != NULL 你从来没有到过 t->FirstChild。

gennode* general::search(int element, gennode *t){
    if(t == NULL)
    {
        return t;
    }
    if(t->item == element)
    {
        return t;
    }
    gennode* sibValue = search(element, t->siblingList);
    if(sibValue != NULL)
    {
        return sibValue;// <-- only return if you have a valid value.
    }
    return search(element, t->firstChild)
}

【讨论】:

    【解决方案3】:

    问题出在

      if(t->siblingList != NULL)
      {
      return search(element, t->siblingList)
      }
    

    return 语句使函数在任何情况下都返回,如果有兄弟姐妹,则独立于是否找到某些东西。

    在节点 2 上,您将返回将其 3 作为兄弟节点,并且永远不会尝试“子”后代。

    这种方式应该是正确的

    gennode* general::search(int element, gennode *t)
    {
      if(t == NULL) //no search at all
      { return NULL; }
      if(t->item == element) // found
      { return t; }
      gennode* z = search(element, t->siblingList);
      if(z) return z; // if found return, otherwise ....
      return search(element, t->firstChild); //... try the other way round
    }
    

    【讨论】:

    • 您不必检查t-&gt;siblingList != NULL,因为该函数会处理它。
    • @Roee Gavirel ...也是firstChild ...已修复
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多