package com.interview.tree;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Date 11/01/2015
* @author Tushar
*
* Encode and decode binary tree using succinct encoding technique
*
* References - http://www.geeksforgeeks.org/succinct-encoding-of-binary-tree/
* https://en.wikipedia.org/wiki/Binary_tree#Succinct_encodings
*/
public class SuccinctTree {
public static class Result {
List<Integer> binaryRep = new ArrayList<>();
List<Integer> actualData = new ArrayList<>();
}
public Result encode(Node root) {
Result r = new Result();
encode(root, r);
return r;
}
private void encode(Node root, Result r) {
if(root == null) {
r.binaryRep.add(0);
return;
}
r.actualData.add(root.data);
r.binaryRep.add(1);
encode(root.left, r);
encode(root.right, r);
}
public Node decode(Result r) {
AtomicInteger x = new AtomicInteger(0);
AtomicInteger y = new AtomicInteger(0);
return decode(r, x, y);
}
private Node decode(Result r, AtomicInteger x, AtomicInteger y) {
if(r.binaryRep.get(x.get()) == 0) {
x.getAndIncrement();
return null;
}
Node root = new Node();
root.data = r.actualData.get(y.getAndIncrement());
x.getAndIncrement();
root.left = decode(r, x, y);
root.right = decode(r, x, y);
return root;
}
public static void main(String args[]) {
Node root = null;
BinaryTree bt = new BinaryTree();
root = bt.addNode(10, root);
root = bt.addNode(-10, root);
root = bt.addNode(20, root);
root = bt.addNode(15, root);
root = bt.addNode(-7, root);
root = bt.addNode(22, root);
root = bt.addNode(-4, root);
root = bt.addNode(12, root);
System.out.println("Before decoding");
TreeTraversals tt = new TreeTraversals();
tt.inOrder(root);
System.out.println();
tt.preOrder(root);
System.out.println();
SuccinctTree st = new SuccinctTree();
Result r = st.encode(root);
root = st.decode(r);
System.out.println("After decoding");
tt.inOrder(root);
System.out.println();
tt.preOrder(root);
}
}