In this project you will write a graphical Java application that display a binary tree based on information about its pre-order traversal.
This is an individual programming assignment. You may get help with concepts and details, such as how to draw in a window, but the code you submit must be yours.
Before you can compile and run the code from the project,
you will need to install
wutil.jar
and
wnonstandard.jar
as described
here.
To give you practice with building and traversing binary trees, as well as implementing a flexible display algorithm.
There are two main components of this assignment:
These classes adapted from the Weiss book may be useful:
BinaryTree
,
BinaryNode
,
TestTreeIterators
. The files are included in the
Displayable
project which you should checkout from your personal SVN repository. You may change any code in them as you see fit, or ignore them except as required below. (Unlike most previous projects, you will have to create additional classes and methods before the project will compile.)
You may find your textbook useful for this assignment; see Chapter 18 for information on trees and appendix B for information on GUIs. The Swing Trail of the Java Tutorial is also a good source of information on Java GUIs.
You must create and submit the following classes, all in the default package:
BinaryTree
The implementation should be a linked representation of a binary tree. The details are up to you, except that it must implement the methods:
public String inOrder()
, which returns a
String
containing the tree contents (according to an in-order traversal), with no added spaces or other extraneous characters.
public int getHeight()
which returns the height of the tree (recall that the height of the empty tree is -1)
Merely constructing a
BinaryTree
and calling the methods mentioned here should not cause any GUI components (JFrame
, etc.) to be constructed. The only thing that should ever cause any GUI components to be constructed is a call to the
display()
method described below.
BuildTree
Must contain this factory method:
public static BinaryTree preOrderBuild(CharSequence chars, CharSequence children)
described in detail below.
Calling this
preOrderBuild
method should not cause any GUI components (JFrame
, etc.) to be constructed.
DisplayableBinaryTree
This class must provide the following constructor:
public DisplayableBinaryTree (BinaryTree t, int windowWidth, int windowHeight)
The window dimensions are in pixels. Calling the DisplayableBinaryTree constructor does not create a window (or any other GUI components); it merely sets the width and height values that will be used for future display windows.
This class must also contain the following two methods:
public void display()
which constructs and pops up a window (with the dimensions specified in the constructor) that is filled with the display of this tree. I.e. the tree diagram should fill (but not overfill) the window.
Note that the window should not be created until
display
is called, and that calling
display
twice on the same tree should result in the display of two different windows. The windows do not have to be user-resizable.
The
display
method is described in detail
below.
public void setSize(int windowWidth, int windowHeight)
Changes the height and width of the display window that will be created the
next
time this tree’s
display()
is called.
These classes may contain additional methods that you need, and you may write additional classes that you find helpful.
These suggested classes may also help you with this assignment:
BinaryNode
The basic binary tree node, containing this node’s character, any other useful info, and references to the roots of its left and right subtrees
DisplayableBinaryNode
Extends BinaryNode and adds the coordinate information for display of the node.
preOrderBuild()
For simplicity of input and tree display, each node of the tree will contain one
Character
. The arguments to
preOrderBuild
are like those from the similar
Written Assignment 4 problem.
The
chars
argument will be a pre-order listing of the contents of the nodes. The
children
argument tells about the children of the corresponding node from
chars
, as follows:
2 | The node has two children. |
0 | The node has no children. |
L | The node only has a left child. |
R | The node only has a right child. |
For example:
BinaryTree t = preOrderBuild("+a*-bcd", "2022000");
constructs the tree in Weiss DS Figure 18.11 (a), and
BinaryTree t2 = preOrderBuild("7215349", "220LR00");
constructs tree in Weiss DS Figure 19.4 (a).
display()
You must use the algorithm from Weiss DS exercise 18.13 (a-b). Notice that this algorithm evenly spaces the x-coordinates of the nodes within the display area.
Display each node as a character inside a circle, with arrows connecting the circles, similar to the trees in the example diagrams, except the node spacing in the book's pictures does not follow the prescribed algorithm; yours must follow that algorithm. In addition, for full credit you should have arrowheads at the lower ends of your connecting lines.
Note that if you follow the given algorithm, all nodes at the same level of the tree will have the same y coordinate. All nodes from the left subtree of a given node will have smaller x coordinates than any of the nodes from its right subtree. The x-coordinates of the nodes will be evenly spaced. The displayed tree should fill (or almost fill) the window. In addition to adjusting the node coordinates based on the dimensions of the window, you should also adjust the font size for displaying node contents and the diameter of the circles surrounding the nodes.
If the tree description is
ABCDEFGHIJKLMNOPQRSTU 220022002200LRR20RLL0
the displayed tree might look something like:
Below are a few more interesting trees. The following Word documents will also be helpful:
Some interesting trees:
A 0 ABC RL0 ABCDEFGHIJKLMNOPQRSTUvwxyz 220022002200LRR20RLLR20RL0 ABCDEFGHIJKLMNOPQRSTUvwxyz01234567 220022002200LRR20RLLR200LR20022000 ABCDEFGHIJKLMNOPQRSTUvwxyz01234567 220022002200LRR20RLLR20RLR220020R0 ABCDEFGHIJKLMNOPQRSTUvwxyz0123456789abc 220022002200LRR20RLLR20RLR220020R2200R0 ABCDEFGHIJKLMNOPQRSTUvwxyz0123456789abcdefg 220022002200LRR20RLLR20RLR220020R2200RRRRR0 ABDGHCEIF 2L2002R00 ABDHIEJKCFLMGNO 222002002200200 ABCEIFJDGHKL L22R0R020200 ABCDEFGHIJKLMNO RLRLRLRLRLRLRL0 ABCDEFGHIJKLMNO LLLLLLLLLLLLLL0 ABCDEFGHIJKLMNOPQRSTU 202020202020202020200 ABDHLPTEIMQUCFJNRVGKOSW 22RLRL0LRLR02RLRL0LRLR0 xABDHIEJKCFLMGNOABDHIEJKCFLMGNO 2222002002200200222002002200200 yxABDHIEJKCFLMGNOABDHIEJKCFLMGNOxABDHIEJKCFLMGNOABDHIEJKCFLMGNO 222220020022002002220020022002002222002002200200222002002200200
Submit your code by committing it to your SVN repository.
Please make sure that you do not submit code that gets into an infinite loop (or infinite recursion). There are no JUnit tests for this assignment. But there is
CheckDisplayableBinaryTree.java
which we will run to test your code;
you should run it
also.