Main Page | Report this Page
 
   
Science Forum Index  »  Compression Forum  »  Huffman Coding
Page 1 of 1    
Author Message
YoungerHacker
Posted: Thu Sep 25, 2003 1:07 pm
Guest
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.
David A. Scott
Posted: Thu Sep 25, 2003 2:51 pm
Guest
mathhurst@prodigy.net (YoungerHacker) wrote in
news:b80c0ff1.0309251107.35617991@posting.google.com:

Quote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.


That depends if one is doing adaptive huffman one does not need to store
the tree in the file and builds it dynamically in one pass. I like adaptive
huffman the best since its one pass and can be coded without any wasted
bits. See my adaptive bijective huffman compressor for an example.
However if you talking traditional static huffman compressor you almost
have to waste space or have a complex program. The traditional approach
is to store the tree in front of the file. I have looked at various ways
and I can say most do a very poor method of storing the tree. I guess the
most common is to measure the length of binary code used and then starting
form first possible value write lenght of output. Example suppose longest
code value for a symbol is 15 bits. Let 0 be not used and 1 to 15 be the
length of each coded string then write each sybol as 4 bits. A better
method be use level numbers instead of length example let 0 be not used
and if lengths used are 7,8,10 00 would be not used 01 would be 7 and
10 would be 8 and 11 would be 10 on decompression one can easily get the
correct lengths since in order and only one set of values work. An other
problem if say 5 levels including not used. They tend to use 3 bits which
allow 8 codeing. They should use some 3 bit values and 2 bit valuses so
only exactly 5 encoding for levels.
I may write code just to create better static tables. I prefer another
method so if I do this I will write more than one routine for people if
you guys interested. Also with static huffman there is only thing you
can do that can not be done with the adaptive version. This is to write
a compression program that will compress as a static huffman but will
never pick table so file increased by more than one byte when compressed.
After all the idea is to try to make file smaller so if one can't why
not only make it at most one byte longer.

David A. Scott
--
My Crypto code
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott19u.zip
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott16u.zip
http://www.jim.com/jamesd/Kong/scott19u.zip old version
My Compression code http://bijective.dogma.net/
**TO EMAIL ME drop the roman "five" **
Disclaimer:I am in no way responsible for any of the statements
made in the above text. For all I know I might be drugged.
As a famous person once said "any cryptograhic
system is only as strong as its weakest link"
Logan Shaw
Posted: Thu Sep 25, 2003 2:56 pm
Guest
YoungerHacker wrote:

Quote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

Here are a couple of ways to store any in-memory binary tree
on disk:

(1) Create the tree in an array to start with. Instead of using
pointers, use array indices to indicate a node's children. Then,
you can just write out the elements of the array to the file,
using whatever representation you like for them.

(2) Given a regular tree (using pointers), recurse through all
the nodes in the tree, writing each leaf node as a record in the
file. If you pass the record number of each node to the caller,
the caller can safely write non-leaf nodes because the children
will have already been written and it will know the record numbers.
Using this method, the very last node written will be the root
of the tree. Of course, you will need to write out the count
of nodes in the tree before you start writing the nodes, so that
you know when you've reached the root. (You need to do that
in method #1 too...)

Neither of these methods is the most efficient possible. I'm
no expert, but I believe there are special ways specific to
huffman trees that can be used to store them. But if you just
want to get something working for your own amusement and
edification, the above should work fine.

- Logan
Logan Shaw
Posted: Thu Sep 25, 2003 3:20 pm
Guest
David A. Scott wrote:
Quote:
Also with static huffman there is only thing you
can do that can not be done with the adaptive version. This is to write
a compression program that will compress as a static huffman but will
never pick table so file increased by more than one byte when compressed.

One other thing you can do with static huffman is have a degree
of random access to your data. In some applications, people care
about that.

- Logan
David A. Scott
Posted: Thu Sep 25, 2003 3:39 pm
Guest
Logan Shaw <lshaw-usenet@austin.rr.com> wrote in
news:P_Icb.118268$KW1.1659@twister.austin.rr.com:

Quote:

One other thing you can do with static huffman is have a degree
of random access to your data. In some applications, people care
about that.



Random access is a lot easyer than with say adaptive but not
all huffman trees are self synchronizing. So you have to be very
careful about the trees itself if such properties are needed.


David A. Scott
--
My Crypto code
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott19u.zip
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott16u.zip
http://www.jim.com/jamesd/Kong/scott19u.zip old version
My Compression code http://bijective.dogma.net/
**TO EMAIL ME drop the roman "five" **
Disclaimer:I am in no way responsible for any of the statements
made in the above text. For all I know I might be drugged.
As a famous person once said "any cryptograhic
system is only as strong as its weakest link"
Marcel van Kervinck
Posted: Thu Sep 25, 2003 4:33 pm
Guest
YoungerHacker <mathhurst@prodigy.net> wrote:
Quote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

You could store the shape of an n-leaf tree in 2n-1 bits
enumerating the nodes, breadth first, left to right,
writing 1 for inner nodes and 0 for leaves:

[] 1
/ \
[] [] 1 0
/ \
[] [] 0 1
/ \
[] [] 0 0

-> 1100100

You can drop the leading bit and two trailing bits
when n is fixed.

This leaves you with encoding what symbol each leaf
represents. The log2(n!) bits needed for that could
be approximated by an arithmetic range encoder. (But
if you have that, one wonders what huffman is doing
there in the first place)

Marcel
-- _ _
_| |_|_|
|_ |_ marcelk@bitpit.net
|_| Marcel van Kervinck
David A. Scott
Posted: Thu Sep 25, 2003 6:25 pm
Guest
Logan Shaw <lshaw-usenet@austin.rr.com> wrote in
news:SDIcb.117160$KW1.24681@twister.austin.rr.com:

Quote:
YoungerHacker wrote:

When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

Here are a couple of ways to store any in-memory binary tree
on disk:

(1) Create the tree in an array to start with. Instead of using
pointers, use array indices to indicate a node's children. Then,
you can just write out the elements of the array to the file,
using whatever representation you like for them.

(2) Given a regular tree (using pointers), recurse through all
the nodes in the tree, writing each leaf node as a record in the
file. If you pass the record number of each node to the caller,
the caller can safely write non-leaf nodes because the children
will have already been written and it will know the record numbers.
Using this method, the very last node written will be the root
of the tree. Of course, you will need to write out the count
of nodes in the tree before you start writing the nodes, so that
you know when you've reached the root. (You need to do that
in method #1 too...)

Neither of these methods is the most efficient possible. I'm
no expert, but I believe there are special ways specific to
huffman trees that can be used to store them. But if you just
want to get something working for your own amusement and
edification, the above should work fine.

- Logan


Phase one
That may not be efficient but the method I am describing next is
an optimal way. Its optimal since any series of bits if long enough
decode to a unique tree that is left leaning. And when one tries to
create the string from a tree the result is unique and any tree
can be made into a left leaning tree.
1) have a file of sorted pairs 256 entries. Each entry is a symbol and
the length for the huffman string used to decode it. symbols with longer
string are coded first. Start by string of "ones" and go left until at
an end node. Note the longest first count the root. Then if less than
255 ones place a "zero" this counts as two symbols since has to be even.
if 255 ones shape of tree done enter phase two. If only one symbol in
file the tree is "01 followed by 8 bits of string value" then encode
a count for number of times it appears and your done. The other code
"00" means file copyed unchanged since no trees makes a smaller file.
This is what you should use if tree makes file longer.
2) crawl back down tree to next unused branch. if a internal node output
a zero if branches to a leaf and a one if it splits. Check for
current height if at previous level you know two more symbols at that
level so no need to write a symbol saying that you just crawl back done
and repeat. If you at a position where only "zeros" can logically follow
your done go to phase two. If you at the root your done go to phase two.
Example the tree with longest path its 255 ones at this phase. The most
any tree can be at this phase are these
1) 254 ones followed by 254 zeros this is the like the tree with the
longest code but one symbol not used.
2) 254 ones followed by 253 zeros followed by a one. Like the above tree
except all symbols used and no symbol has length one but three of length
two.
Example of trees
no symbols copy code 00
1 symbol 01
two symbols 10
three symbol 1100
four symbols 1101 all of length 2
four symbols 111000 two at length 3 one at length 2 and one length 1
five symbols 111001 two at length 3 three at length 2
five symbols 111010 four at length 3 and one at length 1
six symbols 1110110 four at length 3 and two at length 2
seven symbols 11101110 six at length 3 and one at length 2
eight symbols 11101111 eight at length 3
five symbols 11110000 two at length 4 and one at lengths 3, 2, and 1

Phase two
The point being for shape of tree 2 to 256 symbols there will be exactly
one less number of ones and the same or less zeros till a tree shape is
defined. After that comes bits for symbols used. Now the symbols are
stored based in order on the smallest number of symbols used. And then
huffman encode two levels remaining symbols. Example suppose 250 symbols
used for eight bit length code and 2 symbols used for 7 bits and 4 symbols
not used at all. Since two symbols the smallest we look at only first
255 possible symbols let seven zeros code for zero sybmol the remainin
254 values code for all but the last we will encode for the lowest value
symbol it has to be there. next will have encode only for the symbols
remaining at the 2 level huffman code. If seven zeros used then 255
symbols remain and 2 levle code if the first symbol happen to be all
8 ones then only one symbol left meaning you encode the two symbols
unquely with for 8 to 16 bits. Next look in order of string lengths
for next least number of symbols in this case the 4 symbol string.
this time since 254 remaining we ignore the last 3 so guaranteed
at least one symbol to be found then encode lowest symbol this will
be from 7 to 8 bits. then then use remaining set of symbols where
last two gone pick from it and so on till done this means the 3
symbols encode with 8 to 24 bits. Know in this case only one set
let that of the 250 symbols you never encode last set. At this
point start encodeing file with you huffman codes. Or since you
can on compression know the exact length of file when encoded
see if it does not increase. If an expansion would have occured
use 00 for complete table and then copy rest of bits in file.
if you treat it as a string 1 in four files even with the 00
code will not change in size.


David A. Scott
--
My Crypto code
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott19u.zip
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott16u.zip
http://www.jim.com/jamesd/Kong/scott19u.zip old version
My Compression code http://bijective.dogma.net/
**TO EMAIL ME drop the roman "five" **
Disclaimer:I am in no way responsible for any of the statements
made in the above text. For all I know I might be drugged.
As a famous person once said "any cryptograhic
system is only as strong as its weakest link"
David A. Scott
Posted: Thu Sep 25, 2003 6:54 pm
Guest
Marcel van Kervinck <marcelk@brick.bitpit.net> wrote in
news:3f736d4f$0$58697$e4fe514c@news.xs4all.nl:

Quote:
YoungerHacker <mathhurst@prodigy.net> wrote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

You could store the shape of an n-leaf tree in 2n-1 bits

Actually 2n-2 and n does not need to be known in advance
and can be gotten from string as read.

Quote:
enumerating the nodes, breadth first, left to right,
writing 1 for inner nodes and 0 for leaves:

[] 1
/ \
[] [] 1 0
/ \
[] [] 0 1
/ \
[] [] 0 0

-> 1100100

Your spaceing does not show correctly on my screen I guess its
the font difference but it looks but you send the tree shape as
6 bits for a tree thats 2 at length 3 and 1 at length 2 and 1 at
lenght 1 the code would be 111000 suspose
you have 00000000 as symbol at length 1 and 00000001 as symbol
at length 2 and 00000010 as symbol at length 3 and symbol
00000011 as symbol at length 3 you would encode the first
symbol as 8 zeros then 7 zeros encodes the next and 7 more
for the third and 7 more for the last then I would use
symbol of length 1 as 1
symbol of length 2 as 01
symbols of length 3 as 001 and 000 respectfully
then encode the file and end bijetively so no count needed
in file data.

Quote:

You can drop the leading bit and two trailing bits
when n is fixed.

Actually its more complicated than that but its
best to have a fixed table that you don't need to send at all.

Quote:

This leaves you with encoding what symbol each leaf
represents. The log2(n!) bits needed for that could
be approximated by an arithmetic range encoder. (But
if you have that, one wonders what huffman is doing
there in the first place)

Actually why not use a full arithmetic encoder from here
to the rest of file. when you decode the symbols you will
end up at some point where you have wieghts that are powers
of two and an arithmetic compressor at that point would be
just as good as the huffman. In fact I have arithmetic compressor
that do huffman coding.

Quote:

Marcel
-- _ _
_| |_|_|
|_ |_ marcelk@bitpit.net
|_| Marcel van Kervinck




David A. Scott
--
My Crypto code
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott19u.zip
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott16u.zip
http://www.jim.com/jamesd/Kong/scott19u.zip old version
My Compression code http://bijective.dogma.net/
**TO EMAIL ME drop the roman "five" **
Disclaimer:I am in no way responsible for any of the statements
made in the above text. For all I know I might be drugged.
As a famous person once said "any cryptograhic
system is only as strong as its weakest link"
Marcel van Kervinck
Posted: Fri Sep 26, 2003 3:25 am
Guest
David A. Scott <daVvid_a_scott@email.com> wrote:
Quote:
Marcel van Kervinck <marcelk@brick.bitpit.net> wrote in
news:3f736d4f$0$58697$e4fe514c@news.xs4all.nl:

YoungerHacker <mathhurst@prodigy.net> wrote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

You could store the shape of an n-leaf tree in 2n-1 bits

Actually 2n-2 and n does not need to be known in advance
and can be gotten from string as read.

That is what I tried to say after the example: you can
drop some bits. 2n-1 is needed when n=1.


Quote:
enumerating the nodes, breadth first, left to right,
writing 1 for inner nodes and 0 for leaves:

[] 1
/ \
[] [] 1 0
/ \
[] [] 0 1
/ \
[] [] 0 0

-> 1100100

Your spaceing does not show correctly on my screen I guess its
the font difference

The ascii diagram is best shown using a
fixed width font.

Quote:
but it looks but you send the tree shape as
6 bits for a tree thats 2 at length 3 and 1 at length 2 and 1 at
lenght 1 the code would be 111000 suspose

It depends on the traversal order. You can traverse
depth-first or breadth first, or whatever pleases
you most. I don't 'see' how to arrive at '111000',
but there are more roads leading to Rome.


Quote:
Actually its more complicated than that but its
best to have a fixed table that you don't need to send at all.

Actually why not use a full arithmetic encoder from here
to the rest of file.

Well, both seem off-topic for the thread. As far as the
original posting goes, the question was how to encode
a huffman tree. Not for arguments against what he is doing
in the first place (encoding the tree) or counter proposals
for what he might be doing after he has encoded the tree
but hasn't told us yet (the rest).

Thank you for mentioning 'bijective' in your posting.
I was starting to miss it. Ofcourse, there is some
redundancy in assuming that any of the n! symbol
permutations are equally likely, or even possible at
all, for a given huffman tree creator. Also, one can
explicitely normalize the permuations symbols with
identical word length. But then we are drifting
away from the question.

Kind regards,

Marcel
-- _ _
_| |_|_|
|_ |_ marcelk@bitpit.net
|_| Marcel van Kervinck
David A. Scott
Posted: Fri Sep 26, 2003 6:50 am
Guest
Marcel van Kervinck <marcelk@brick.bitpit.net> wrote in
news:3f7405f5$0$58701$e4fe514c@news.xs4all.nl:

Quote:
David A. Scott <daVvid_a_scott@email.com> wrote:
Marcel van Kervinck <marcelk@brick.bitpit.net> wrote in
news:3f736d4f$0$58697$e4fe514c@news.xs4all.nl:

YoungerHacker <mathhurst@prodigy.net> wrote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

You could store the shape of an n-leaf tree in 2n-1 bits

Actually 2n-2 and n does not need to be known in advance
and can be gotten from string as read.

That is what I tried to say after the example: you can
drop some bits. 2n-1 is needed when n=1.


You let n start at 2 since that is the smallest tree
00 could flag a copy with no real binary tree
01 could signal only one symbol type used in file

Quote:

enumerating the nodes, breadth first, left to right,
writing 1 for inner nodes and 0 for leaves:

[] 1
/ \
[] [] 1 0
/ \
[] [] 0 1
/ \
[] [] 0 0

-> 1100100

Your spaceing does not show correctly on my screen I guess its
the font difference

The ascii diagram is best shown using a
fixed width font.

but it looks but you send the tree shape as
6 bits for a tree thats 2 at length 3 and 1 at length 2 and 1 at
lenght 1 the code would be 111000 suspose

It depends on the traversal order. You can traverse
depth-first or breadth first, or whatever pleases
you most. I don't 'see' how to arrive at '111000',
but there are more roads leading to Rome.


Well it was obvious to me but then I usually take the
path least well traveled.

Quote:

Actually its more complicated than that but its
best to have a fixed table that you don't need to send at all.

Actually why not use a full arithmetic encoder from here
to the rest of file.

Well, both seem off-topic for the thread. As far as the
original posting goes, the question was how to encode
a huffman tree. Not for arguments against what he is doing
in the first place (encoding the tree) or counter proposals
for what he might be doing after he has encoded the tree
but hasn't told us yet (the rest).

Thank you for mentioning 'bijective' in your posting.
I was starting to miss it. Ofcourse,

Then we both felt it was needed how nice.



David A. Scott
--
My Crypto code
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott19u.zip
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott16u.zip
http://www.jim.com/jamesd/Kong/scott19u.zip old version
My Compression code http://bijective.dogma.net/
**TO EMAIL ME drop the roman "five" **
Disclaimer:I am in no way responsible for any of the statements
made in the above text. For all I know I might be drugged.
As a famous person once said "any cryptograhic
system is only as strong as its weakest link"
Marcel van Kervinck
Posted: Fri Sep 26, 2003 11:56 am
Guest
David A. Scott <daVvid_a_scott@email.com> wrote:

Quote:
You let n start at 2 since that is the smallest tree
00 could flag a copy with no real binary tree
01 could signal only one symbol type used in file

You are absolutely right ofcourse. I realized too
late I forgot to the delete that erroneous side
remark. Lets attribute it to bad proof reading or
sloppy editting, which is no real excuse, but
often people get away with it anyway.

Marcel
-- _ _
_| |_|_|
|_ |_ marcelk@bitpit.net
|_| Marcel van Kervinck
David A. Scott
Posted: Fri Sep 26, 2003 1:04 pm
Guest
Marcel van Kervinck <marcelk@brick.bitpit.net> wrote in
news:3f747ddd$0$58709$e4fe514c@news.xs4all.nl:

Quote:
David A. Scott <daVvid_a_scott@email.com> wrote:

You let n start at 2 since that is the smallest tree
00 could flag a copy with no real binary tree
01 could signal only one symbol type used in file

You are absolutely right ofcourse. I realized too
late I forgot to the delete that erroneous side
remark. Lets attribute it to bad proof reading or
sloppy editting, which is no real excuse, but
often people get away with it anyway.

Marcel

Thank You few on the Usegroup here would be man enough
to admit such a mistake. On second thought in case your
a not a man it also applies to women and children and etc.




David A. Scott
--
My Crypto code
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott19u.zip
http://cryptography.org/cgi-bin/crypto.cgi/Misc/scott16u.zip
http://www.jim.com/jamesd/Kong/scott19u.zip old version
My Compression code http://bijective.dogma.net/
**TO EMAIL ME drop the roman "five" **
Disclaimer:I am in no way responsible for any of the statements
made in the above text. For all I know I might be drugged.
As a famous person once said "any cryptograhic
system is only as strong as its weakest link"
Dale King
Posted: Fri Sep 26, 2003 4:52 pm
Guest
"Marcel van Kervinck" <marcelk@brick.bitpit.net> wrote in message
news:3f736d4f$0$58697$e4fe514c@news.xs4all.nl...
Quote:
YoungerHacker <mathhurst@prodigy.net> wrote:
When you're doing Huffman coding, how would you store the tree? The
whole thing is binary, and the output must be too. I'm not worried
about implementations, I'm using a prog language. Since it's binary,
any implementation that requires a special character is right out.

You could store the shape of an n-leaf tree in 2n-1 bits
enumerating the nodes, breadth first, left to right,
writing 1 for inner nodes and 0 for leaves:

[] 1
/ \
[] [] 1 0
/ \
[] [] 0 1
/ \
[] [] 0 0

-> 1100100

You can drop the leading bit and two trailing bits
when n is fixed.

You can do better than that however. It starts with going to a Canonical
Huffman. Canonical Huffman rearranges the tree a bit. Realize that you can
swap any 2 nodes at the same depth without affecting the length of the
output. All it affects is which code gets assigned to which symbol. We also
can swap any 2 nodes of the same weight. If you favor internal nodes over
leaf nodes of the same weight you will get the minimum depth tree.

Canonical Huffman uses this fact to create a tree of specific shape instead
of the arbitrary shape of the Huffman algorithm itself. So the Canonical
version of your tree would look like this:

[]
/ \
[] []
/ \
[] []
/ \
[] []

To reproduce the shape of the tree all we need to know is the number of leaf
nodes at each depth. For this tree that would be 0, 1, 1, 2. We know the
range of possible values to restrict it further. The number of leaf nodes at
any level cannot be more than twice the number of internal nodes on the
previous level. So at the root it either is 0 or 1. For the next level it is
0, 1, or 2. If you know the total number of leaves you can restrict this
further. So in this case if we knew that n was 4 we know at each level the
possible range of number of leaf nodes is:

[] { 0 }
/ \
[] [] { 1, 2 }
/ \
[] [] { 1 }
/ \
[] [] { 2 }

Since only one of the values can change that means there are only 2 shapes
for a Canonical Huffman tree with 4 leaves, which is true.

--
Dale King
Dale King
Posted: Mon Sep 29, 2003 4:06 pm
Guest
"Dale King" <KingD@tmicha.net> wrote in message
news:3f74cc4f@news.tce.com...
Quote:
To reproduce the shape of the tree all we need to know is the number of
leaf
nodes at each depth. For this tree that would be 0, 1, 1, 2. We know the
range of possible values to restrict it further. The number of leaf nodes
at
any level cannot be more than twice the number of internal nodes on the
previous level. So at the root it either is 0 or 1. For the next level it
is
0, 1, or 2. If you know the total number of leaves you can restrict this
further. So in this case if we knew that n was 4 we know at each level the
possible range of number of leaf nodes is:

[] { 0 }
/ \
[] [] { 1, 2 }
/ \
[] [] { 1 }
/ \
[] [] { 2 }

Since only one of the values can change that means there are only 2 shapes
for a Canonical Huffman tree with 4 leaves, which is true.

I realized I goofed on the second level of the tree. I put the possible
number of internal nodes instead of the possible number of leaf nodes. The
possible number of leaves should be { 0, 1 }. { 1, 2 } is the possible
number of internal nodes at that level.
 
Page 1 of 1       All times are GMT - 5 Hours
The time now is Fri Dec 05, 2008 6:27 am