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-是的,这将是一个显著的改进。