diff --git a/src/main/java/cz/it4i/qcmp/huffman/HuffmanNode.java b/src/main/java/cz/it4i/qcmp/huffman/HuffmanNode.java
index 34d16ccc58e280693a2ee96664c689700e8a24ea..f81e5d3a7c944eb06e34f96f92559c91b14fdede 100644
--- a/src/main/java/cz/it4i/qcmp/huffman/HuffmanNode.java
+++ b/src/main/java/cz/it4i/qcmp/huffman/HuffmanNode.java
@@ -22,10 +22,22 @@ public class HuffmanNode implements Comparable<HuffmanNode> {
this.leaf = true;
}
- public HuffmanNode(final double probability, final HuffmanNode parentA, final HuffmanNode parentB) {
- this.probability = probability;
- this.subNodeA = parentA;
- this.subNodeB = parentB;
+ private HuffmanNode(final HuffmanNode parentA, final HuffmanNode parentB) {
+ subNodeA = parentA;
+ subNodeB = parentB;
+ }
+
+ public static HuffmanNode constructWithSymbol(final HuffmanNode parentA, final HuffmanNode parentB, final int symbol) {
+ final HuffmanNode node = new HuffmanNode(parentA, parentB);
+ node.symbol = symbol;
+ node.leaf = (parentA == null && parentB == null);
+ return node;
+ }
+
+ public static HuffmanNode constructWithProbability(final HuffmanNode parentA, final HuffmanNode parentB, final double probability) {
+ final HuffmanNode node = new HuffmanNode(parentA, parentB);
+ node.probability = probability;
+ return node;
}
public HuffmanNode traverse(final boolean queryBit) {
@@ -74,4 +86,32 @@ public class HuffmanNode implements Comparable<HuffmanNode> {
public HuffmanNode getSubNodeB() {
return subNodeB;
}
+
+ private static boolean treeNodeEquality(final HuffmanNode A, final HuffmanNode B) {
+ if (A.leaf) {
+ if (!B.leaf) {
+ return false;
+ }
+ return A.symbol == B.symbol;
+ } else {
+ if (B.leaf) {
+ return false;
+ }
+ if (A.bit != B.bit)
+ return false;
+
+ if ((A.subNodeA != null && B.subNodeA == null) || (A.subNodeA == null && B.subNodeA != null))
+ return false;
+ if ((A.subNodeB != null && B.subNodeB == null) || (A.subNodeB == null && B.subNodeB != null))
+ return false;
+
+ final boolean subTreeAResult = treeNodeEquality(A.subNodeA, B.subNodeA);
+ final boolean subTreeBResult = treeNodeEquality(A.subNodeB, B.subNodeB);
+ return (subTreeAResult && subTreeBResult);
+ }
+ }
+
+ public boolean treeEqual(final HuffmanNode opposite) {
+ return treeNodeEquality(this, opposite);
+ }
}
\ No newline at end of file