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