我将为您提供一种算法,用于比较两个树,并检查其中一个树是否为另一个树的子树。
首先,我提供了自己的树实现,其结构如下:
以下图片可以让您了解情况:
树1
树2
如图所示,我想要检查树1的所有子树是否包含在树2中。这些树的根节点仅是虚拟元素,用于访问子树。
我总是检查树1的子树是否包含在树2中。类型为Tree1的节点始终具有一个后继节点(Microcontroller.Memory),而类型为Tree2的节点可以具有多个后继节点(Microcontroller.Memory/Memory/Memory)。
ElementType确定节点是否相等。
比较方法应返回True,如果所有子树都包含在另一棵树中,则返回False。我试图提供一个算法,但我仍然有一些递归调用的问题。到目前为止,我已经做了以下工作:
类TreePlatform:
首先,我提供了自己的树实现,其结构如下:
public class PlatformTree {
private HwNode root;
.......
}
public class HwNode {
private HwNode parent;
private ElementType elementType;
private Hardware hw;
private List<Node> children = new ArrayList<Node>();
public Node(Node parent, ElementType elementType, Hardware hw) {
...
}
public void addChild(Node child) {
children.add(child);
}
....
以下图片可以让您了解情况:
树1
树2
如图所示,我想要检查树1的所有子树是否包含在树2中。这些树的根节点仅是虚拟元素,用于访问子树。
我总是检查树1的子树是否包含在树2中。类型为Tree1的节点始终具有一个后继节点(Microcontroller.Memory),而类型为Tree2的节点可以具有多个后继节点(Microcontroller.Memory/Memory/Memory)。
ElementType确定节点是否相等。
比较方法应返回True,如果所有子树都包含在另一棵树中,则返回False。我试图提供一个算法,但我仍然有一些递归调用的问题。到目前为止,我已经做了以下工作:
类TreePlatform:
public boolean containsSubTree(PlatformTree tree1) {
Boolean b = true;
// check all subtrees of Tree1
if (tree1.getRoot() != null && getRoot() != null) {
for (HwNode subRootNode : tree1.getRoot().getChildren()) {
b = getRoot().containsSubTree(subRootNode);
}
} else {
return false;
}
return b;
}
Class HwNode
public boolean containsSubTree(HwNode abstractNode) {
for (HwNode subRootNode : getChildren()) {
if (hasSubTree(subRootNode, abstractNode)) {
return true;
}
}
return false;
}
private boolean hasSubTree(HwNode subRootNode, HwNode abstractNode) {
if (subRootNode.getElementType() != abstractNode.getElementType()) {
return false;
}
if (!abstractNode.getChildren().isEmpty()) {
if (!subRootNode.getChildren().isEmpty()) {
HwNode abstractSubNode = abstractNode.getChildren().get(0);
for (HwNode subNode : subRootNode.getChildren()) {
if (!hasSubTree(subNode, abstractSubNode)) {
return false;
}
}
} else {
return false;
}
} else if (subRootNode.getChildren().isEmpty()) {
return true;
}
return true;
}
我对我的算法还不满意,但目前卡住了,不知道如何解决。有什么想法可以将两个树进行比较吗?