Algorithm 一棵树的值与另一棵树的值匹配

Algorithm 一棵树的值与另一棵树的值匹配,algorithm,recursion,tree,binary-tree,Algorithm,Recursion,Tree,Binary Tree,我正在树上解决几个问题,为技术面试做准备。我偶然发现一个问题,看看一棵树(子集)的值是否与另一棵树(主树)的值匹配 例如 3 is part of 4 / \ -----------> / \ 7 9 3 7 / \

我正在树上解决几个问题,为技术面试做准备。我偶然发现一个问题,看看一棵树(子集)的值是否与另一棵树(主树)的值匹配

例如

          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)); 
    }
}
公共静态布尔IsubSet(TreeNode子节点,TreeNode主节点){
if(子节点==null)
返回true;
if(mainNode==null)
返回false;
if(子节点数据等于(主节点数据)){
返回(isSubset(子节点左侧,主节点)和&isSubset(子节点右侧,主节点));
}否则{
返回(isSubset(子节点,mainNode.left)| | isSubset(子节点,mainNode.right));
}
}
但此解决方案仅检查节点的顺序(根、左和右)是否与mainTree中的相同。
我应该在上面的代码中更改什么,以便检查子树中的每个节点与主树中的每个节点是否匹配?

如果我了解您的要求,您根本不关心树结构;您只需测试以
子节点为根的树的每个元素是否存在于以
主节点为根的树中。我建议您开发一个谓词(我们称之为
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);
}
公共静态布尔IsubSet(TreeNode子节点,TreeNode主节点){
if(子节点==null)
返回true;
if(mainNode==null)
返回false;
返回mainNode.contains(子节点.data)
&&isSubset(子节点左侧,主节点)
&&isSubset(子节点右侧,主节点);
}

完美。非常感谢你,先生!虽然这确实有效,但有点慢,因为它没有利用任何一个子集的树结构。最好有一个版本的
contains()
返回包含
子节点.data
的节点,而不仅仅是
true
。假设您将此节点分配给
x
。然后,您可以只搜索
x.left
(而不是整个
main节点
)以查找
子节点.left
,同样地搜索
x.right
子节点.right
@j_random_hacker-是的,这将是一个显著的改进。