From: Randolph Wang <rywang@CS.Princeton.EDU>
Date: Tue, 13 Apr 2004 23:58:15 -0400 (EDT)
To: allisonl@Princeton.EDU
Cc: randy_class@CS.Princeton.EDU
Subject: questions about assignment
You're confusing several things here.
c is the character contained in the root node of the tree.
it's either * or a letter.
d (I suppose) is the character you just read in from the file.
it's either 0 or 1.
I think you're massively confusing the two.
"char c = CharStdIn.readChar();" would wipe out the character
contained in the root node and replace it with one read from the
input file. (There can be no reason why one would want to do that.)
"char d = CharStdIn.readChar();
if (d == '*') {
doesn't make much sense because things read from the input file
can't possibly be a star.
----------------------------------------------------------------------
There are a bunch of other things wrong with your code. More
specifically, the way you advance x seems a bit confused. (I can't
tell exactly what you mean, but you might have had the right idea: x
should be replaced by x.left or x.right at each step, and it needs to
be reset to "this" when you reach the leaf. You might have had this
idea but your code is not doing this idea.)
Also, remember: c is the character contained in the *root* node of the
tree. If you need the character further down the tree, you don't want
c, you want x.c, because x is a node further down the tree as you
advance down the tree.
<BODY><P>Professor Wang-</P>
<P>I have been working on the programming assignment for a while now, and I am stuck with step 3 (writing the uncompress method). What I have so far is as follows:</P>
<P>public class PrefixTree {<BR> private char c;<BR> private PrefixTree left, right;<BR> <BR> public PrefixTree() {<BR> c = CharStdIn.readChar(); <BR> if (c == '*') { <BR> left = new PrefixTree();<BR> right = new PrefixTree(); <BR> }<BR> } <BR> <BR> public void preorder(String prefix) {<BR> if (c == '*') { <BR> left.preorder(prefix + "0");<BR> right.preorder(prefix + "1");<BR> }<BR> else System.out.println(c + " " + prefix.length() + " " + prefix);<BR> } <BR> <BR> public void uncompress() {<BR> PrefixTree x = this;<BR> while (!CharStdIn.isEmpty()) { <BR> char d = CharStdIn.readChar();<BR> if (d == '*') {<BR>
char c = CharStdIn.readChar();<BR> if (c == '0' || c == '1') { <BR> if (c == '0') x = x.left;<BR> else x = x.right; <BR> } <BR> x = this;<BR> }<BR> else { <BR> System.out.print(d);<BR> //x = this;<BR> }<BR> } <BR> }</P>
<P>public static void main (String[] args) {<BR> PrefixTree tree = new PrefixTree();<BR> tree.preorder("");<BR> tree.uncompress();<BR> }<BR>}</P>
<P>I am having problems with incrementing d by one character without also incrementing c. (right now, the method just prints back all the numbers). Do you have any suggestions for how I should proceed?</P>
<P>Thanks,</P>
<P>Allison</P>
<P>P.S. File is also attached if you can't read it well enough in email body</P></BODY>
----dcf10cc2a385556
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=PrefixTree.java
cHVibGljIGNsYXNzIFByZWZpeFRyZWUgewoJcHJpdmF0ZSBjaGFyIGM7Cglwcml2YXRlIFBy
ZWZpeFRyZWUgbGVmdCwgcmlnaHQ7CgkKCXB1YmxpYyBQcmVmaXhUcmVlKCkgewoJCWMgPSBD
aGFyU3RkSW4ucmVhZENoYXIoKTsJCQoJCWlmIChjID09ICcqJykgewkJCQoJCQlsZWZ0ID0g
bmV3IFByZWZpeFRyZWUoKTsKCQkJcmlnaHQgPSBuZXcgUHJlZml4VHJlZSgpOwkJCgkJfQoJ
fQkKCQoJcHVibGljIHZvaWQgcHJlb3JkZXIoU3RyaW5nIHByZWZpeCkgewoJCWlmIChjID09
ICcqJykgewkJCQoJCQlsZWZ0LnByZW9yZGVyKHByZWZpeCArICIwIik7CgkJCXJpZ2h0LnBy
ZW9yZGVyKHByZWZpeCArICIxIik7CgkJfQoJCWVsc2UgU3lzdGVtLm91dC5wcmludGxuKGMg
KyAiICIgKyBwcmVmaXgubGVuZ3RoKCkgKyAiICIgKyBwcmVmaXgpOwoJfQkKCQoJcHVibGlj
IHZvaWQgdW5jb21wcmVzcygpIHsKCQlQcmVmaXhUcmVlIHggPSB0aGlzOwoJCXdoaWxlICgh
Q2hhclN0ZEluLmlzRW1wdHkoKSkgewkJCQoJCQljaGFyIGQgPSBDaGFyU3RkSW4ucmVhZENo
YXIoKTsKCQkJaWYgKGQgPT0gJyonKSB7CgkJCQkJY2hhciBjID0gQ2hhclN0ZEluLnJlYWRD
aGFyKCk7CgkJCQlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnMScpIHsJCQkJCgkJCQkJaWYgKGMg
PT0gJzAnKSB4ID0geC5sZWZ0OwoJCQkJCWVsc2UgeCA9IHgucmlnaHQ7CQkJCQoJCQkJfQkK
CQkJCXggPSB0aGlzOwoJCQl9CgkJCWVsc2UgeyAKCQkJCVN5c3RlbS5vdXQucHJpbnQoZCk7
CgkJCQkvL3ggPSB0aGlzOwoJCQkJfQoJCQl9CQkKCX0JCgkJCQoJCQkJCQkKCQoJLypwdWJs
aWMgdm9pZCB1bmNvbXByZXNzICgpIHsKCQlQcmVmaXhUcmVlIHggPSB0aGlzOwoJCXdoaWxl
KCFDaGFyU3RkSW4uaXNFbXB0eSgpKSB7IAoJLy8JeC5wcmVvcmRlcigiIik7CgkJCWNoYXIg
YyA9IENoYXJTdGRJbi5yZWFkQ2hhcigpOwoJCQkKCQkJaWYoeC5jID09ICcqJykgewkJCQkJ
CQoJCQkJaWYgKHguYyA9PSAnMCcgfHwgeC5jID09ICcxJykgewkJCQkKCQkJCQlpZiAoeC5j
ID09ICcwJykKCQkJCQkJeCA9IHgubGVmdDsgCgkJCQkJZWxzZSB4ID0geC5yaWdodDsJCQoJ
CQkJfQoJCQkJCgkJCQl4ID0gdGhpczsKCQkJfQoJCQlTeXN0ZW0ub3V0LnByaW50KHguYyk7
CQoJCQoJCS8vCUdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZz8KCQkKCQkKCQkvL1N5c3RlbS5v
dXQucHJpbnQoeC5jKTsKCQkvLwkJeCA9IHRoaXM7CgkvLwl4ID0gdGhpczsJCgkJfQoJCQoJ
fSovCi8qCXB1YmxpYyB2b2lkIHVuY29tcHJlc3MoKSB7CgkJUHJlZml4VHJlZSB4ID0gdGhp
czsKCQlQcmVmaXhUcmVlIHkgPSB0aGlzOwoJCXdoaWxlKCFDaGFyU3RkSW4uaXNFbXB0eSgp
KSB7CgkJCQoJCQljaGFyIGMgPSBDaGFyU3RkSW4ucmVhZENoYXIoKTsKCQkJaWYgKHguYyA9
PSAnKicpIHsKCQkJCQoJCQkJaWYgKHkuYyA9PSAnMCcgfHwgeS5jID09ICcxJykgewoJCQkJ
aWYgKHkuYyA9PSAnMCcpIHsJCQkJCQoJCQkJeSA9IHkubGVmdDsKCQkJCX0gZWxzZSB5ID0g
eS5yaWdodDsKCQkJCQoJCQkvLwl4ID0gdGhpczsKCQkJCX0KCQkJU3lzdGVtLm91dC5wcmlu
dCh5LmMpOwoJCQl5ID0gdGhpczsKCQkJfQoJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih4LmMp
OwoJCQkKCQl9Cgl9Ki8KCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFy
Z3MpIHsKCQlQcmVmaXhUcmVlIHRyZWUgPSBuZXcgUHJlZml4VHJlZSgpOwoJCXRyZWUucHJl
b3JkZXIoIiIpOwoJCXRyZWUudW5jb21wcmVzcygpOwoJfQp9Cg==
questions about assignment / Randolph Wang