2014-03-31 33 views
0

我正在解決樹上的一些問題以爲科技採訪做準備。我偶然發現了一個問題,查看是否有例如一棵樹的價值與​​其他樹匹配

  3  is part of    4 
     /\ ----------->   /\ 
     7 9       3 7 
             /\ 
              8 9 

一個樹(子)另一棵樹(主樹)的匹配值

的價值觀,我想出了以下的解決方案。

public static boolean isSubset(TreeNode<String> subNode, TreeNode<String> mainNode){ 
    if(subNode == null)  
     return true; 

    if(mainNode == null) 
     return false; 

    if(subNode.data.equals(mainNode.data)){ 
     return (isSubset(subNode.left,mainNode) && isSubset(subNode.right,mainNode)); 
    }else{ 
     return (isSubset(subNode,mainNode.left) || isSubset(subNode,mainNode.right)); 
    } 
} 

但是這個解決方案只檢查節點是否與mainTree中的順序相同(根,左和右)。 我應該在上面的代碼中更改哪些內容,以便我可以檢查子樹中每個節點的主樹的每個節點的匹配情況?

回答

0

如果我明白你的要求,你完全不關心樹結構;您只需測試植根於subNode的樹的每個元素是否存在於植根於mainNode的樹中。我建議你開發一個謂詞(我們稱之爲contains),測試一個值是否在樹中。那麼你可以建立在:

public static boolean isSubset(TreeNode<String> subNode, TreeNode<String> mainNode){ 
    if(subNode == null)  
     return true; 

    if(mainNode == null) 
     return false; 

    return mainNode.contains(subNode.data) 
     && isSubset(subNode.left, mainNode) 
     && isSubset(subNode.right, mainNode); 
} 
+0

完美。謝謝你,先生! – user3476229

+0

雖然這確實有效,但它有點慢,因爲它沒有利用任何子集的樹結構。最好有一個'contains()'的版本,它返回包含'subNode.data'的節點,而不是'true'。假設你將這個節點分配給'x'。然後,您可以搜索'x.left'(而不是整個'mainNode')作爲'subNode.left',同樣也搜索'x.right'和'subNode.right'。 –

+0

@j_random_hacker - 是的,這將是一個重大的改進。 –