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