簡體   English   中英

用c ++搜索樹(不是二進制)

[英]Searching a tree in c++(not binary)

我之前問了一個類似的問題,但現在我正在尋找一個為什么這不起作用而不是“幫助我解決”。

我必須創建一個如下所示的通用樹:

                       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.

有誰知道我迷路了嗎?

您需要在兄弟搜索中控制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;
}

問題在於

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

如果有兄弟姐妹,則返回語句會使函數返回,如果找到某些東西則獨立返回。

在節點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-> siblingList!=你從未得到過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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM