c++中的树遍历

Tree traversal in c++

本文关键字:遍历 c++      更新时间:2023-10-16

我有一个足够简单的赋值。我必须创建一个树,使用这个结构:

 struct gennode
{
 int item;
 gennode * firstChild;
 gennode * siblingList;
 gennode * prevSibling;
 gennode * parent;
};

我的搜索算法是:

gennode* general::search(int element, gennode *t)
{
  if(t == NULL)
    {
      return t;
    }
  if(t->item == element)
    {
      return t;
    }
  if(t->firstChild != NULL)
    {
      return search(element, t->firstChild);
    }
    return search(element, t->siblingList);
}
我不知道出了什么问题。它似乎并不想找到所有的孩子。例如,如果我有1作为根,2、3、4是它的子结点,5、6、7是2的子结点,8、9是4的子结点,我就无法找到2的子结点。

我不知道我的问题在哪里。

编辑:下面是一个以1为根结点,2和3为子结点的树的基因节点结构的示例。

gennode * one;
gennode * two;
gennode * three;
one->item = 1;
one->firstChild = two;
one->siblingList = NULL;
one->prevSibling = NULL;
one->parent = NULL;
two->item = 2;
two->firstChild = NULL;
two->siblingList = three;
two->prevSibling = NULL;
two->parent = one;
three->item = 3;
three->firstChild = NULL;
three->siblingList = NULL;
three->prevSibling = two;
three->parent = one;

看起来您的问题是搜索firstChild或siblingList的逻辑。也就是说,如果你有一个firstChild,你永远不会看到兄弟姐妹。如果您的树是从后到前构建的,那么它可能解释了为什么要搜索节点4,而不是节点2。相反,您可能想要询问search(element, t->firstChild)是否成功,如果失败,则执行search(element, t->siblingList):

if(t->firstChild != NULL)
{
  auto result = search(element, t->firstChild);
  if( result != nullptr )
    return result;
}
return search(element, t->siblingList);