Re: Print a binary search tree
On Oct 24, 7:29 pm, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:
On Wed, 24 Oct 2007 08:54:47 -0700, kaltizer <kevinalti...@gmail.com>
wrote, quoted or indirectly quoted someone who said :
null <- BinarySearchTreeSet$TreeNode@69b332 -> null
You may have other problems, but I think you want to implement a
toString method for your nodes that prints out something entertaining.
Instead you are just getting the default toString which is designed
purely for debugging.
--
Roedy Green Canadian Mind Products
The Java Glossaryhttp://mindprod.com
I have fixed the print to console problem. Now I am having problems
printing to the text file. I've commented in the file where the
problem is. Any help is greatly appreciated.
// Kevin Altizer 23 October 2007
// PURPOSE: File for a binary search tree class
// COMPILER: Java JDK 1.5, with jGRASP 1.8.6_04 as the IDE
// LIMITATIONS: Limited error checking
import java.util.*;
import java.io.*;
class AltizerProject4 implements Serializable {
// Inner class defining a binary tree node
private class TreeNode {
private TreeNode left;
private Comparable key;
private TreeNode right;
}
// Instance variables
private TreeNode root, parent, child;
private String sourceName = null;
// Constructor
public AltizerProject4() {
root = null;
}
// Inserts a key into the set
public void insert(Comparable key) {
TreeNode newNode;
if (search(key)) {
System.out.println("Duplicates are not allowed");
}
else {
newNode = new TreeNode();
newNode.key = key;
newNode.left = null;
newNode.right = null;
if (parent == null)
root = newNode;
else if (parent.key.compareTo(key) > 0)
parent.left = newNode;
else
parent.right = newNode;
}
}
// Removes a key from the set
public void remove(Comparable key) {
if (!search(key)) {
System.out.println(key + " is not in the database");
}
else {
if (child == root)
root = deleteNode(root);
else if (parent.left == child)
parent.left = deleteNode(parent.left);
else
parent.right = deleteNode(parent.right);
System.out.println("The name " + key + " was deleted");
}
}
// Determines whether a key is in the set
public boolean contains(Comparable key) {
if (!search(key))
return false;
return true;
}
// Private method that searches for a key
private boolean search(Comparable key) {
parent = null;
child = root;
while (child != null)
{
if (child.key.equals(key))
return true;
parent = child;
if (child.key.compareTo(key) > 0)
child = child.left;
else
child = child.right;
}
return false;
}
// Private method that deletes a node
private TreeNode deleteNode(TreeNode node) {
TreeNode inorderSuccessor, successorsParent;
if (node.right == null)
return node.left; // 0-1 Child
else if (node.left == null)
return node.right; // 1 Child
else { // 2 Children
successorsParent = node.left;
inorderSuccessor = successorsParent.right;
if (inorderSuccessor == null) {
node.left = successorsParent.left;
node.key = successorsParent.key;
}
else {
while (inorderSuccessor.right != null) {
successorsParent = inorderSuccessor;
inorderSuccessor = inorderSuccessor.right;
}
successorsParent.right = inorderSuccessor.left;
node.key = inorderSuccessor.key;
}
}
return node;
}
// print tree in order
public void print() {
recprint(root);
System.out.println();
}
private void recprint(TreeNode p) { // recursively print the tree
values in sorted order
if (p == null)
return;
recprint (p.left);
System.out.print(p.key + "\n");
recprint (p.right);
}
// load data from text file
public void loadData(String sourceName) {
// Remember the source name.
this.sourceName = sourceName;
try {
// Create a BufferedReader for the file.
BufferedReader in = new BufferedReader(
new FileReader(sourceName));
String name;
// Read each name and number and add the entry to the list.
while ( (name = in.readLine()) != null) {
// Add an entry for this name and number.
insert(name);
}
// Close the file.
in.close();
}
catch (FileNotFoundException ex) {
// Do nothing - no data to load.
return;
}
catch (IOException ex) {
System.err.println("Load of directory failed.");
ex.printStackTrace();
System.exit(1);
}
}
// begin save method
/** Method to save the directory.
pre: The directory has been loaded with data.
post: Contents of directory written back to the file in the
form of name-number pairs on adjacent lines.
modified is reset to false.
*/
public void save(String sourceName) {
try {
// Create PrintWriter for the file.
PrintWriter out = new PrintWriter(
new FileWriter(sourceName));
// Write the name(s) to the text file.
// The next line is where the problem is.
// For some reason I get a 'cannot fine symbol' error at
// the selection period before print();
out.print();
// Close the file.
out.close();
}
catch (Exception ex) {
System.err.println("Save of directory failed");
ex.printStackTrace();
System.exit(1);
}
}
} // end class