すべてのツツリーマッチング指定サブツリーをJava
-
21-09-2019 - |
質問
皆様にお伝えしたくて書き込みコードJavaを用い、順序付け根付き木の各ノードが任意の数を子ノード。与えられます、サブツリー S、こういうことができるようにすべてのツに合わせS(すべてのツTると同型になる。
るサブツリーのTと同型になるSの場合、ノードのSマにマッピングさせることができるノードのように端Sマップ端子
A 前の質問 本報告書についてどのようにされている場合は、見つけるツリーが別のサブツリーじゃなくてもいいと思うんだけどへの参加を希望される すべての ツに合わせS.またこういうことができるように地図から各ノードに各試合に対応するノードS.
この時の試合が見つかるので、このプロバイダを返すことはできないとして、データへのバッファへのポインタのノードのTがツリーに根差すものと一致するが、試合に返される必要があのようなものとしてリストのペアのポインタのノード[(T1,S1),(T2,S2,...Tn,Sn)]などがT1でのポインタをノードにプノードS1のサブツリーです。
また単なるリストのペアの値が返される各ノードのツリーのTおよびサブツリーは独特の整数値識別子に関連付けられています。
例えば:
与えられる木としており
a
/ \
b c
/ \
d e
およびサブツリー S:
x
/ \
y z
以下のリストのマッチが返されます:
[a,x,b,y)、(c,z)] [b,x),(d,y)、(e,z)]
独自の試合で決定のノードT ない のマッピングのノードT,S.
そのため、以下のマッチ:
[a,x),(b,z),(c,y)]
との複製
[a,x),(b,y),(c,z)]
ないため、同じセットのノードからT(a,b,c)のみの試合は返却されます。
としても、これらのツリー T:
a
/|\
b c d
およびサブツリー S
x
/ \
y z
以下のリストのマッチが返されます:
[a,x,b,y)、(c,z)] [a,x,b,y)、(d,z)] [a,x),(c)については、(d,z)]
誰でもできるので例を挙げコードをどうるのか?
編集に係るクリス-観音コメント):
おうと思っていたい人コード その答えですか?どこまでしていま 頂いており?どのコードで書かれているか?– クリス-観音1時間前
私は、以下のコードする場合、ビルドの一覧が表示(matchesList)のポインタをツリー内のノードがツに根ざした一致する、指定されたサブツリー.しかしあツに根ざしたのと同じノードを現在の各ノードのみが加わった最も一度matchesListにかかわらず、試合に根ざした。
また、できない作業方法を構築するためにはマッピング上記のノード間のサブツリーとノードに合わせた独自の樹木です。
package Example;
import java.util.LinkedList;
import java.util.Vector;
public class PartialTreeMatch {
public static void main(String[] args) {
NodeX testTree = createTestTree();
NodeX searchTree = createSearchTree();
System.out.println(testTree);
System.out.println(searchTree);
partialMatch(testTree, searchTree);
}
static LinkedList<NodeX> matchesList = new LinkedList<NodeX>();
private static boolean partialMatch(NodeX tree, NodeX searchTree) {
findSubTreeInTree(tree, searchTree);
System.out.println(matchesList.size());
for (NodeX n : matchesList) {
if (n != null) {
System.out.println("Found: " + n);
}
}
return false;
}
private static NodeX findSubTreeInTree(NodeX tree, NodeX node) {
if (tree.value == node.value) {
if (matchChildren(tree, node)) {
matchesList.add(tree);
}
}
NodeX result = null;
for (NodeX child : tree.children) {
result = findSubTreeInTree(child, node);
if (result != null) {
if (matchChildren(tree, result)) {
matchesList.add(result);
}
}
}
return result;
}
private static boolean matchChildren(NodeX tree, NodeX searchTree) {
if (tree.value != searchTree.value) {
return false;
}
if (tree.children.size() < searchTree.children.size()) {
return false;
}
boolean result = true;
int treeChildrenIndex = 0;
for (int searchChildrenIndex = 0; searchChildrenIndex < searchTree.children
.size(); searchChildrenIndex++) {
// Skip non-matching children in the tree.
while (treeChildrenIndex < tree.children.size()
&& !(result = matchChildren(tree.children
.get(treeChildrenIndex), searchTree.children
.get(searchChildrenIndex)))) {
treeChildrenIndex++;
}
if (!result) {
return result;
}
}
return result;
}
private static NodeX createTestTree() {
NodeX subTree2 = new NodeX('A');
subTree2.children.add(new NodeX('A'));
subTree2.children.add(new NodeX('A'));
NodeX subTree = new NodeX('A');
subTree.children.add(new NodeX('A'));
subTree.children.add(new NodeX('A'));
subTree.children.add(subTree2);
return subTree;
}
private static NodeX createSearchTree() {
NodeX root = new NodeX('A');
root.children.add(new NodeX('A'));
root.children.add(new NodeX('A'));
return root;
}
}
class NodeX {
char value;
Vector<NodeX> children;
public NodeX(char val) {
value = val;
children = new Vector<NodeX>();
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('(');
sb.append(value);
for (NodeX child : children) {
sb.append(' ');
sb.append(child.toString());
}
sb.append(')');
return sb.toString();
}
}
上記のコードを見つけようとしますの究の対象に:
A
/|\
A A A
/ \
A A
合わせ:
A
/ \
A A
このコードに成功していることを検出するとい試合に根ざしたのトップノードツリーの第3子どものです。しかし、実際の3試合に根ざした時のトップノードだけでなく、ひとつ。また、コードしないをマッピングツリー内のノードとノードのサブツリーをさせることができませんどの関係ではないかと思います。
誰でもできるので意を得ている場合はこの限りでは分かるのか?
解決
行きたいというニーズが再帰的方法のニーズにリストを返しの部分一致するだけではなく、boolean.るだに解決の両方の問題に戻る必要があるリストにマッチとともに、複数のマッチ).
Javaのような擬似コードの再帰関数のようになります:
findMatches(treeNode, searchNode) {
if searchNode has no children {
// search successful
pairs = [] // empty list
return [pairs] // list of lists
}
else {
matches = [] // empty list
searchChild = first child node of searchNode
searchNode2 = searchNode with searchChild removed
// NOTE: searchNode2 is created by doing a shallow copy of just the node
// (not it's children) and then removing searchChild from the child list.
for each treeChild in treeNode.children {
if treeChild.value == searchChild.value {
treeNode2 = treeNode with treeChild removed // also a shallow copy
childMatches = findMatches(searchChild, treeChild)
nodeMatches = findMatches(treeNode2, searchNode2)
// cross-product
for each nodeMatchPairs in nodeMatches {
for each childMatchPairs in childMatches {
fullMatchPairs = [(searchChild, treeChild)]
+ childMatchPairs + nodeMatchPairs // concatenate lists
add fullMatchPairs to matches
}
}
}
}
return matches
}
}
この機能は有効になっている必要がありtreeNode.値==searchNode.価値を追加したことに一覧です。呼び出し側が必要となる。この機能を必要とするすべてのノードのツリーです。
として現在に設計でうれすぎてメモリーができる最適化されています。
他のヒント
この でご提供いただきました。