Java 草垛和针叶树结构的比较
我想写一个方法,记录草堆节点的所有位置,从其自身的模式(结构)与针的模式(结构)匹配的位置开始。存储在节点中的值不需要相等,它只是应该匹配的模式 插图 示例1 如果我有下面的草堆和针 在上面的例子中,程序需要记录Java 草垛和针叶树结构的比较,java,tree,Java,Tree,我想写一个方法,记录草堆节点的所有位置,从其自身的模式(结构)与针的模式(结构)匹配的位置开始。存储在节点中的值不需要相等,它只是应该匹配的模式 插图 示例1 如果我有下面的草堆和针 在上面的例子中,程序需要记录 ROOT ROOT->Left 示例2 如果我有和上面一样的干草堆和我的针 然后我的节目会录制 ROOT ROOT->Left ROOT->Right 然而,我实现代码的方式似乎有缺陷,因为我的方法甚至记录了不应该为真的位置 我实现代码的方式是,我使用以下方法
ROOT
ROOT->Left
示例2
如果我有和上面一样的干草堆和我的针
然后我的节目会录制
ROOT
ROOT->Left
ROOT->Right
然而,我实现代码的方式似乎有缺陷,因为我的方法甚至记录了不应该为真的位置
我实现代码的方式是,我使用以下方法返回一个包含所有这些位置的列表,我使用isSubtree方法检查从特定节点开始的模式是否找到匹配项
public static List<String> searchForNeedleInHaystack(Node haystack,
Node needle) {
List<String> resultList = new ArrayList<String>();
if(haystack.getLeftChild() != null) {
value = value + "L";//value is just a global string variable initially ""
if(isSubtree(haystack.getLeftChild(), needle)) {
resultList.add(value);
} else {
if(value.length() > 1)
value = value.substring(0, value.length() - 1);
}
searchForNeedleInHaystack(haystack.getLeftChild(), needle);
}
if(haystack.getRightChild() != null) {
value = value + "R";
if(isSubtree(haystack.getRightChild(), needle)) {
resultList.add(value);
} else {
if(value.length() > 1)
value = value.substring(0, value.length() - 1);
}
searchForNeedleInHaystack(haystack.getRightChild(), needle);
}
return resultList;
}
public static boolean isSubtree(Node haystack, Node needle) {
if(needle == null)
return true;
if(haystack == null)
return false;
return isSubtree(haystack.getLeftChild(), needle.getLeftChild()) && isSubtree(haystack.getRightChild(), needle.getRightChild());
}
问题
我只是想知道我可以使用什么样的逻辑来成功比较子树结构
提前谢谢 也许你也需要在
isSubtree
方法中检查needle和haystack的值是否相等?这些值并不重要,因为我只是想看看结构是否相同。包含的值不需要相等
public class Node {
private String info;
private Node leftChild = null;
private Node rightChild = null;
public Node() {
this("");
}
public Node(String info) {
this.info = info;
}
public void setinfo(String info) {
this.info = info;
}
public void setLeftChild(Node n) {
leftChild = n;
}
public void setRightChild(Node n) {
rightChild = n;
}
public Node getLeftChild() {
return leftChild;
}
public Node getRightChild() {
return rightChild;
}
public String getinfo() {
return info;
}
public boolean isLeaf() {
return rightChild == null && leftChild == null;
}
}