#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Node_t
{
int data;
struct Node_t* left;
struct Node_t* right;
} Node;
int treeCompare(Node* n1, Node* n2)
{
if (!n1) return (n2==NULL);
if (!n2 || (n1->data != n2->data)) return 0;
return (treeCompare(n1->left, n2->left) &&
treeCompare(n1->right, n2->right));
}
//utility
int countNodes(Node* n)
{
if (!n) return 0;
return 1+countNodes(n->left)+countNodes(n->right);
}
int* bencodeHelper(Node* n, int* code, int* pos, int* flag)
{
int hasKids = (n->left!=0);
code[*flag/32]|=hasKids<<(*flag&31);
*flag+=1;
if (hasKids) bencodeHelper(n->left, code, pos, flag);
code[*pos]=n->data;
*pos+=1;
if (hasKids) bencodeHelper(n->right, code, pos, flag);
return code;
}
int* bencode(Node* h, int* sizeOut)
{
int nnodes=countNodes(h);
int nflags
= (int)ceil(nnodes
/32.0); int pos=nflags+1;
int flag=32;
int* out;
*sizeOut = 1+nnodes+nflags;
out
= calloc(*sizeOut
, sizeof(int)); if (!h) return out;
out[0]=nflags+1;
return bencodeHelper(h,out,&pos,&flag);
}
Node* bdecodeHelper(int* code, int* pos, int* flag)
{
Node
*n
= calloc(1, sizeof(Node
)); int hasKids = code[*flag/32]>>(*flag&31)&1;
*flag+=1;
if (hasKids) n->left = bdecodeHelper(code, pos, flag);
n->data = code[*pos];
*pos+=1;
if (hasKids) n->right = bdecodeHelper(code, pos, flag);
return n;
}
Node* bdecode(int* code)
{
int flag=32;
int pos=code[0];
if (!pos) return NULL;
return bdecodeHelper(code, &pos, &flag);
}
Node* makeRandomTree(float freq, int maxDepth)
{
Node* n;
if (maxDepth
-- && (rand()/(float)RAND_MAX
< freq
)) {
n->left = makeRandomTree(freq, maxDepth);
n->right = makeRandomTree(freq, maxDepth);
}
return n;
}
int main(int argc, char* argv[])
{
Node* head = makeRandomTree(0.79,8);
Node* dup;
int i,sz;
int nnodes = countNodes(head);
int* code = bencode(head, &sz);
printf("Tree with %d nodes encodes to %d ints\n",nnodes
,sz
); for (i=0;i<sz;++i)
{
}
dup = bdecode(code);
if (treeCompare
(head
,dup
)) { puts("Trees Compare Exactly!\n"); } else {puts("FAILURE\n");} }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCgp0eXBlZGVmIHN0cnVjdCBOb2RlX3QKewogICBpbnQgZGF0YTsKICAgc3RydWN0IE5vZGVfdCogbGVmdDsKICAgc3RydWN0IE5vZGVfdCogcmlnaHQ7Cn0gTm9kZTsKCmludCB0cmVlQ29tcGFyZShOb2RlKiBuMSwgTm9kZSogbjIpCnsKICAgaWYgKCFuMSkgcmV0dXJuIChuMj09TlVMTCk7CiAgIGlmICghbjIgfHwgKG4xLT5kYXRhICE9IG4yLT5kYXRhKSkgcmV0dXJuIDA7CiAgIHJldHVybiAodHJlZUNvbXBhcmUobjEtPmxlZnQsIG4yLT5sZWZ0KSAmJgogICAgICAgICAgICB0cmVlQ29tcGFyZShuMS0+cmlnaHQsIG4yLT5yaWdodCkpOwp9CgoKCi8vdXRpbGl0eQppbnQgY291bnROb2RlcyhOb2RlKiBuKQp7CiAgIGlmICghbikgcmV0dXJuIDA7CiAgIHJldHVybiAxK2NvdW50Tm9kZXMobi0+bGVmdCkrY291bnROb2RlcyhuLT5yaWdodCk7Cn0KCgoKaW50KiBiZW5jb2RlSGVscGVyKE5vZGUqIG4sIGludCogY29kZSwgaW50KiBwb3MsIGludCogZmxhZykKewogICBpbnQgaGFzS2lkcyA9IChuLT5sZWZ0IT0wKTsKICAgY29kZVsqZmxhZy8zMl18PWhhc0tpZHM8PCgqZmxhZyYzMSk7CiAgICpmbGFnKz0xOwogICBpZiAoaGFzS2lkcykgYmVuY29kZUhlbHBlcihuLT5sZWZ0LCBjb2RlLCBwb3MsIGZsYWcpOwogICBjb2RlWypwb3NdPW4tPmRhdGE7CiAgICpwb3MrPTE7CiAgIGlmIChoYXNLaWRzKSBiZW5jb2RlSGVscGVyKG4tPnJpZ2h0LCBjb2RlLCBwb3MsIGZsYWcpOwogICByZXR1cm4gY29kZTsKfQoKCmludCogYmVuY29kZShOb2RlKiBoLCBpbnQqIHNpemVPdXQpCnsKICAgaW50IG5ub2Rlcz1jb3VudE5vZGVzKGgpOwogICBpbnQgbmZsYWdzID0gKGludCljZWlsKG5ub2Rlcy8zMi4wKTsKICAgaW50IHBvcz1uZmxhZ3MrMTsKICAgaW50IGZsYWc9MzI7CiAgIGludCogb3V0OwogICAqc2l6ZU91dCA9IDErbm5vZGVzK25mbGFnczsKICAgb3V0ID0gY2FsbG9jKCpzaXplT3V0LCBzaXplb2YoaW50KSk7CiAgIGlmICghaCkgcmV0dXJuIG91dDsKICAgb3V0WzBdPW5mbGFncysxOwogICByZXR1cm4gYmVuY29kZUhlbHBlcihoLG91dCwmcG9zLCZmbGFnKTsKfQoKCgpOb2RlKiBiZGVjb2RlSGVscGVyKGludCogY29kZSwgaW50KiBwb3MsIGludCogZmxhZykKewogICBOb2RlKm4gPSBjYWxsb2MoMSwgc2l6ZW9mKE5vZGUpKTsKICAgaW50IGhhc0tpZHMgPSBjb2RlWypmbGFnLzMyXT4+KCpmbGFnJjMxKSYxOwogICAqZmxhZys9MTsKICAgaWYgKGhhc0tpZHMpIG4tPmxlZnQgPSBiZGVjb2RlSGVscGVyKGNvZGUsIHBvcywgZmxhZyk7CiAgIG4tPmRhdGEgPSBjb2RlWypwb3NdOwogICAqcG9zKz0xOwogICBpZiAoaGFzS2lkcykgbi0+cmlnaHQgPSBiZGVjb2RlSGVscGVyKGNvZGUsIHBvcywgZmxhZyk7CiAgIHJldHVybiBuOwp9CgpOb2RlKiBiZGVjb2RlKGludCogY29kZSkKewogICBpbnQgZmxhZz0zMjsKICAgaW50IHBvcz1jb2RlWzBdOwogICBpZiAoIXBvcykgcmV0dXJuIE5VTEw7CiAgIHJldHVybiBiZGVjb2RlSGVscGVyKGNvZGUsICZwb3MsICZmbGFnKTsKfQoKCk5vZGUqIG1ha2VSYW5kb21UcmVlKGZsb2F0IGZyZXEsIGludCBtYXhEZXB0aCkKewogICBOb2RlKiBuOwogICBuID0gY2FsbG9jKDEsc2l6ZW9mKE5vZGUpKTsKICAgbi0+ZGF0YSA9IHJhbmQoKTsKICAgaWYgKG1heERlcHRoLS0gJiYgKHJhbmQoKS8oZmxvYXQpUkFORF9NQVggPCBmcmVxKSkKICAgewogICAgICBuLT5sZWZ0ID0gbWFrZVJhbmRvbVRyZWUoZnJlcSwgbWF4RGVwdGgpOwogICAgICBuLT5yaWdodCA9IG1ha2VSYW5kb21UcmVlKGZyZXEsIG1heERlcHRoKTsKICAgfQogICByZXR1cm4gbjsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICBOb2RlKiBoZWFkID0gbWFrZVJhbmRvbVRyZWUoMC43OSw4KTsKICAgTm9kZSogZHVwOwogICBpbnQgaSxzejsKICAgaW50IG5ub2RlcyA9IGNvdW50Tm9kZXMoaGVhZCk7CiAgIGludCogY29kZSA9IGJlbmNvZGUoaGVhZCwgJnN6KTsKICAgcHJpbnRmKCJUcmVlIHdpdGggJWQgbm9kZXMgZW5jb2RlcyB0byAlZCBpbnRzXG4iLG5ub2Rlcyxzeik7CiAgIGZvciAoaT0wO2k8c3o7KytpKQogICB7CiAgICAgIHByaW50ZigiJS40eCwgIixjb2RlW2ldKTsKICAgfQogICBwdXRzKCJcbiIpOwogICBkdXAgPSBiZGVjb2RlKGNvZGUpOwogICBpZiAodHJlZUNvbXBhcmUoaGVhZCxkdXApKSB7IHB1dHMoIlRyZWVzIENvbXBhcmUgRXhhY3RseSFcbiIpOyB9CiAgIGVsc2Uge3B1dHMoIkZBSUxVUkVcbiIpO30KfQo=
Tree with 61 nodes encodes to 64 ints
0003, 72c4e37d, 43265e2, 643c9869, 6b8b4567, 79e2a9e3, 2eb141f2, 216231b, 12200854, 1f16e9e8, 515f007c, 1190cde7, 3d1b58ba, 41a7c4c9, 7fdcc233, 6b68079a, 109cf92e, 519b500d, 4e6afb66, 431bd7b7, 140e0f76, 3f2dba31, 238e1f29, 333ab105, 436c6125, 6763845e, 2443a858, 8edbdab, 257130a3, 836c40e, 71f32454, 2901d82, 189a769b, 1e7ff521, 3a95f874, 7c3dbd3d, 4353d0cd, 737b8ddc, 2ae8944a, 3804823e, 440badfc, 2463b9ea, 7724c67e, 5e884adc, 419ac241, 3855585c, 580bd78f, 70a64e2a, 51ead36b, 1d4ed43b, 6a2342ec, 725a06fb, 3006c83e, 542289ec, 7a6d8d3c, 38437fdb, 2cd89a32, 32fff902, 22221a70, 579478fe, 74b0dc51, 79a1deaa, 3dc240fb, 12e685fb,
Trees Compare Exactly!