CS 3723
 Programming Languages 
   Trees in C++ and Java  


Overview: For some applications, there are features of C++ and Java that are so similar that it is possible to translate back and forth with little change.


The programs: Here the differences are in red.

TreeS.cpp: Binary search tree in C++ TreeTestS.java: Binary search tree in Java

// Binary Search Trees in C++
//   (translated from a Java program)
#include <iostream.h>
#include <stdlib.h>
class TreeNode {
public:
   TreeNode *left;  // pointer to left child
   int data;       // data item
   TreeNode *right; // pointer to right child
   // Constructor: tree with one node
   TreeNode (int d = 0) {
      data = d;
      left = right = 0;
   }
   // insert:  ignores duplicates
   void insert (int d) {
      if (d < data) {
         if (left == 0) left = new TreeNode(d);
         else left -> insert(d);
      }
      else if (d > data) {
         if (right == 0) right = new TreeNode(d);
         else right -> insert(d);
      }
   }
};
// Tree: uses TreeNode class
class Tree {
   TreeNode *root;
public:
   Tree() {root = 0;} // empty tree
   void insertNode (int d) {
      if (root == 0) root = new TreeNode(d);
      else root -> insert(d);
   }
   void inorderTrav() {inorderT(root);}
   void inorderT(TreeNode *node) {
      if (node == 0) return;
      inorderT(node -> left);
      cout << node -> data << " ";
      inorderT(node -> right);
   }
};
// main: test the Tree and TreeNode classes

int main () {
   Tree *tree = new Tree(); // empty tree
   int intVal;
   // insert 10 random ints
   cout << "Inserting the values: ";
   for (int i = 1; i <= 10; i++) {
      intVal = (int) (drand48()*100);
      cout << intVal << " ";
      tree -> insertNode(intVal);
   }
   cout << "\nInorder Traversal: ";
   tree -> inorderTrav();
   cout << "\n";
}

// Binary Search Trees in Java
//   (adapted from Deitel & Deitel, Chapter 17)
import java.util.*;

class TreeNode {

   public TreeNode left;  // ref to left child
   public int data;       // data item
   public TreeNode right; // ref to right child
   // Constructor: tree with one node
   public TreeNode (int d) {
      data = d;
      left = right = null;
   }
   // insert:  ignores duplicates
   public void insert (int d) {
      if (d < data) {
         if (left == null) left = new TreeNode(d);
         else left.insert(d);
      }
      else if (d > data) {
         if (right == null) right = new TreeNode(d);
         else right.insert(d);
      }
   }
}
// Tree: uses TreeNode class
class Tree {
   private TreeNode root;

   public Tree() {root = null;} // empty tree
   public void insertNode (int d) {
      if (root == null) root = new TreeNode(d);
      else root.insert(d);
   }
   public void inorderTrav() {inorderT(root);}
   public void inorderT(TreeNode node) {
      if (node == null) return;
      inorderT(node.left);
      System.out.print(node.data + " ");
      inorderT(node.right);
   }
}
// TreeTest: test the Tree and TreeNode classes
public class TreeTestS {
   public static void main (String args[]) {
      Tree tree = new Tree(); // empty tree
      int intVal;
      // insert 10 random ints
      System.out.print("Inserting the values: ");
      for (int i = 1; i <= 10; i++) {
         intVal = (int) (Math.random()*100);
         System.out.print(intVal + " ");
         tree.insertNode(intVal);
      }
      System.out.print("\nInorder Traversal: ");
      tree.inorderTrav();
      System.out.println();
   }
}


Output of sample runs:
    Output from both programs:
       Inserting the values: 39 84 35 44 31 88 1 58 15 38 
       Inorder Traversal: 1 15 31 35 38 39 44 58 84 88
    


Revision date: 2013-02-16. (Please use ISO 8601, the International Standard.)