在C

2017-07-13 124 views
1

二叉樹搜索字符串我是計算機專業的學生,​​我上週在C.在C

其中一個問題有一個考試是一個二進制搜索一個特定的詞(串)樹,並計算它出現的次數。

樹中的每個節點都包含一個字母。

例如,如果單詞是「媽媽」,並且樹看起來像附加圖像,則函數應該返回2.請注意,如果有這樣的單詞 - 「momom」 - 函數將會計數「媽媽」只有一次。

我還沒有能夠解決這個問題。你能幫我嗎?

The example of tree

 a 
    /\ 
    b m 
//\ 
v o o 
    /\ \ 
    m t m 
+0

所以這個詞是樹,如果這個詞的所有字母是樹? – wdc

+0

是的,但按順序 – Luli

+0

所以,基本上,你有一本字典,並正在尋找具有特定子字符串的所有單詞... – blackghost

回答

0

你要列舉所有詞語的樹,並在詞的兩端檢查是否有使用strstr()匹配。

要搜索的關鍵字是樹行走樹深度優先

您的樹結構的語義混淆。爲了澄清你的問題,你應該手工列舉出現在樹中的所有單詞,然後編寫一個遍歷樹並打印相同列表的函數,最後一步很簡單:不要打印它們,檢查字符串是否與strstr匹配,以及統計匹配詞。

+0

是的,這是測試中的任務,但我還沒有解決它。我試圖做你說的,但沒有成功 – Luli

+0

你應該發佈樹結構和語義的確切定義。 – chqrlie

+0

typedef struct tnode { \t char ch; \t struct tnode * left; \t struct tnode * right; } TNODE; typedef結構樹{ \t TNODE * root; } TREE; – Luli

1

所以基本上,因爲圖像中的樹似乎沒有排序或平衡,所以你必須搜索每一個分支,直到你找到一個匹配,或者你打了一個葉子。一旦你打了一場比賽,你可以忽略下面的所有分支,因爲它們不相關。但除此之外,你不知道樹的深度,所以你不能根據深度提前結束搜索。

所以,你的算法會是這樣來的效果:

// returns the number of matches 
// matchMask is a bitmap of the string sublengths that match so far... 
int search(const char *substr, int substrlen, uint32_t matchMask, node_t *node) { 
    uint16_t newMatchMask = 0; 
    int bit; 
    ASSERT(substrlen < (sizeof(matchMask)*8)); 
    if (node == NULL) { 
     // hit a leaf, stop return 0 
     return 0; 
    } 

    while (bit = LSB(matchMask) != -1) 
    { 
     if (node->ch == substr[bit+1]) 
      newMatchMask |= (1 << (bit+1)); 
    } 
    if (node->ch == substr[0]) 
      newMatchMask; 

    if (newMatchMask & (1 << strlen)) { 
     // found a match, don't bother recursing 
     return 1; 
    } else { 
     return 
      search(substr, substrlen, newMatchMask, node->left) + 
      search(substr, substrlen, newMatchMask, node->right); 
    } 
} 

注意,我不得不做一些時髦的位圖的東西有跟蹤到目前爲止匹配,你可以匹配的深處部分子字符串。假設LSB是最低有效位的宏,如果沒有設置位,則返回-1。此外,這沒有經過測試,所以在位掩碼中可能會出現錯誤,但這個想法仍然存在。

- 編輯 -

哎呀,忘了停下遞歸如果您的節點是空白...修復