150 likes | 243 Views
More on Trees. CS1316: Representing Structure and Behavior. Story. Tree data structure as a list of lists Visualizing trees Traversing trees Pre-order and post-order. Our SoundTree Class Structure. abstract CollectableNode Knows next
E N D
More on Trees CS1316: Representing Structure and Behavior
Story • Tree data structure as a list of lists • Visualizing trees • Traversing trees • Pre-order and post-order
Our SoundTree Class Structure abstract CollectableNode Knows next Knows How to do basic list operations, and defines abstract sound operations (can collect() its sound(s)) The subclasses extendCollectableNode SoundBranch Knows children Knows How add children, and collect all the sounds from its children and next SoundNode Knows mySound Knows How collect itself and its next
Our SoundTree Class Structure (a little further) abstract CollectableNode Knows next Knows How to do basic list operations, and collect() SoundBranch Knows children Knows How add children, and collect() SoundNode Knows mySound Knows Howcollect() ScaleBranch Knows a scaling factor Knows How to access scaling factor, and to collect from children then scale the resultant sound
Recall for handling sounds Welcome to DrJava. > SoundTreeExample tree = new SoundTreeExample(); tree.setUp(); > tree.play() > tree.playScaled(2.0); > tree.play();
What a tree “looks like” (printed, e.g., toString()) > tree SoundTreeExample@92b1a1 > tree.root() SoundBranch (with child: SoundBranch (with child: SoundNode (with sound: Sound number of samples: 28568 and next: SoundNode (with sound: Sound number of samples: 46034 and next: null and next: ScaleBranch (1.0) SoundBranch (with child: SoundNode (with sound: Sound number of samples: 47392 and next: SoundNode (with sound: Sound number of samples: 32126 and next: null and next: SoundBranch (with child: SoundNode (with sound: Sound number of samples: 8452 and next: SoundNode (with sound: Sound number of samples: 28568 and next: null and next: No next))) and next: No next) Obviously, this doesn’t help us much, but the root() does But this textual representation isn’t so clear, is it? Could you modify toString() to fix this?
A visual alternative (hierarchical) root: SoundBranch branch1: SoundBranch SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
Children of root root: SoundBranch branch1: SoundBranch A linked list, with branch1 as top/head of list. If you look at the code, the variable children just points to the first child, which is the head of a linked list. SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
Children of branch1 root: SoundBranch branch1: SoundBranch Also a linked list. We are representing a tree as a list of lists. SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
Traversing the tree: tree.root().collect() SoundBranch code root: SoundBranch public Sound collect(){ Sound childSound; if (children != null) {childSound = children.collect();} else {childSound = new Sound(1);} branch1: SoundBranch SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
Traversing the tree: tree.root().collect() SoundBranch code root: SoundBranch public Sound collect(){ Sound childSound; if (children != null) {childSound = children.collect();} else {childSound = new Sound(1);} branch1: SoundBranch SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
Traversing the tree: tree.root().collect() SoundNode code root: SoundBranch public Sound collect(){ if (this.getNext() == null) {return mySound;} else {return mySound.append(this.getNext().collect());} } branch1: SoundBranch SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
Traversing the tree: tree.root().collect() SoundNode code root: SoundBranch public Sound collect(){ if (this.getNext() == null) {return mySound;} else {return mySound.append(this.getNext().collect());} } branch1: SoundBranch SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)
root: SoundBranch branch1: SoundBranch SoundNode (clap+rest+snap) SoundNode (aah+snap+rest) scaledBranch: ScaleBranch SoundNode (clink+clave+gong) SoundNode (is+chirp+clap) branch2: SoundBranch SoundNode (clap+snap+snap) SoundNode (bassoon+snap+clap)