Upload
kellie-whitehead
View
215
Download
2
Embed Size (px)
Citation preview
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 Structureabstract CollectableNode
Knows next
Knows How to do basic list operations, and defines abstract sound operations (can collect() its sound(s))
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
The subclasses extend CollectableNode
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 How collect()
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
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
Children of root
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
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.
Children of branch1
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
Also a linked list.
We are representing a tree as a list of lists.
Traversing the tree: tree.root().collect()
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
public Sound collect(){ Sound childSound; if (children != null) {childSound = children.collect();} else {childSound = new Sound(1);}
SoundBranch code
Traversing the tree: tree.root().collect()
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
public Sound collect(){ Sound childSound; if (children != null) {childSound = children.collect();} else {childSound = new Sound(1);}
SoundBranch code
Traversing the tree: tree.root().collect()
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
SoundNode code
public Sound collect(){ if (this.getNext() == null) {return mySound;} else {return mySound.append(this.getNext().collect());} }
Traversing the tree: tree.root().collect()
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)
SoundNode code
public Sound collect(){ if (this.getNext() == null) {return mySound;} else {return mySound.append(this.getNext().collect());} }
root: SoundBranch
branch1: SoundBranch
scaledBranch: ScaleBranch
branch2: SoundBranch
SoundNode (clap+rest+snap)
SoundNode (aah+snap+rest)
SoundNode (clink+clave+gong)
SoundNode (is+chirp+clap)
SoundNode (clap+snap+snap)
SoundNode (bassoon+snap+clap)