Go Premium for a chance to win a PS4. Enter to Win

x
Solved

# Problem using recursive function to compare trees in Java

Posted on 2012-04-09
Medium Priority
641 Views
Hi

I have to find the best matching subtrees in two xml trees.
here is the code (in brief):

``````public static void FindBestMatchingSubtree(int doc1, int doc2, Node n1, Node n2, SQLScript statement) {
// retrieve internal nodes for the first and second trees

ArrayList<Node> t1Nodes = statement.getInternalChildNodes(doc1, n1);
ArrayList<Node> t1Nodes = statement.getInternalChildNodes(doc2, n2);

for (Node t1childNode : t1Nodes) {  // to iterate child nodes of the 1st ArrayList
for (Node t2childNode : t2Nodes) {  // to iterate child nodes of the 2nd ArrayList

if (t1childNode.getNodeName().equals(t2childNode.getNodeName())) {
score = calculateScore(t1childNode, t2childNode, statement);

// Test if two pair of nodes for the two trees are matched
if (score == 1.0) { // Identical nodes
System.out.println("Identical");
}
else if ((score < 1.0) && (score > 0)) { // Matched nodes (semi)
System.out.println("Matched");
// recursively match the child nodes of the current ones
FindBestMatchingSubtree(doc1, doc2, t1childNode, t2childNode, statement);
}
} // end if

}  // end for
// Just hint for the output
System.out.println("Finish one child from the first tree");
}  // end for
}
``````

Job of the function:
- It takes as input two document ids and two nodes of them (say root nodes of XML document.
- It then create two ArrayLists of child nodes for both given nodes n1 & n2.
- It will then compare pairs of nodes to find if they are Identical or matched (using special function calculateScore).
- If they are identical, print that.
- If they are matched (not exactly the same), go deeper and repeat the process by comparing child nodes of the current pair.

The problem:
I get wrong result because I think when the function (FindBestMatchingSubtree) is called inside itself it will repeat creating the two ArrayLists: t1Nodes & t2Nodes, which is wrong

Can anyone help to achieve the goal without having such a problem

Regards
0
Question by:hamsalgla
• 2
• 2

LVL 11

Assisted Solution

anilallewar earned 300 total points
ID: 37826686
The array lists t1Nodes & t2Nodes that are created with each recursive call is fine as those would be different objects that get created on stack.

What is the significance of int doc1, int doc2 as they get passed for each recursive call but don't change within the execution?

I will need more information including the code to make further suggestions.
0

LVL 20

Expert Comment

ID: 37827270
>>I get wrong result

How can you tell? Please post sample data, the resulting output using your code and the desired output
0

LVL 20

Assisted Solution

gatorvip earned 300 total points
ID: 37827279
>>       ArrayList<Node> t1Nodes = statement.getInternalChildNodes(doc1, n1);
ArrayList<Node> t1Nodes = statement.getInternalChildNodes(doc2, n2);

Check your code, this should probably say t2Nodes. I assume this is just a copy/paste typo in here as in real code you should be getting an error (t2Nodes would be undefined).
0

Accepted Solution

hamsalgla earned 0 total points
ID: 37828202
What is the significance of int doc1, int doc2 as they get passed for each recursive call but don't change within the execution?

doc1 and doc2 are passed as parameters getInternalChildNodes function to get the list of nodes for doc1 and doc1 (see line 4 and 5).
They do not affect the results.

>>       ArrayList<Node> t1Nodes = statement.getInternalChildNodes(doc1, n1);
ArrayList<Node> t1Nodes = statement.getInternalChildNodes(doc2, n2);

Check your code, this should probably say t2Nodes. I assume this is just a copy/paste typo in here as in real code you should be getting an error (t2Nodes would be undefined).

Yes I made a typo mistake.

Actually I found the problem. that is a exit from the function:
``````if (t1Nodes.isEmpty() || t2Nodes.isEmpty()) {
System.exit(0);
}
``````
It was in line 9 (inside the two loops)
I remove it from the code here because I thought it is not significant.
When I replace it with If..Else condition, the program works fine and I get the correct results.

I will back to you as soon as i have probs since this is just a very small part of my big project :)

0

Author Closing Comment

ID: 37848065
Calling 'System.exit()' inside the function can be a good practice as long as you know it will not end the program unexpectedly.

0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
Java functions are among the best things for programmers to work with as Java sites can be very easy to read and prepare. Java especially simplifies many processes in the coding industry as it helps integrate many forms of technology and different d…
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …
###### Suggested Courses
Course of the Month11 days, 5 hours left to enroll