// Fig. 17.16: Tree.java package com.deitel.jhtp2.ch17; // Class TreeNode definition class TreeNode { // friendly access members TreeNode left; // left node int data; // data item TreeNode right; // right node // Constructor: initialize data to d and make this a leaf node public TreeNode( int d ) { data = d; left = right = null; // this node has no children } // Insert a TreeNode into a Tree that contains nodes. // Ignore duplicate values. public synchronized 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 ); } } } // Class Tree definition public class Tree { private TreeNode root; // Construct an empty Tree of integers public Tree() { root = null; } // Insert a new node in the binary search tree. // If the root node is null, create the root node here. // Otherwise, call the insert method of class TreeNode. public synchronized void insertNode( int d ) { if ( root == null ) root = new TreeNode( d ); else root.insert( d ); } // Preorder Traversal public void preorderTraversal() { preorderHelper( root ); } // Recursive method to perform preorder traversal private void preorderHelper( TreeNode node ) { if ( node == null ) return; System.out.print( node.data + " " ); preorderHelper( node.left ); preorderHelper( node.right ); } // Inorder Traversal public void inorderTraversal() { inorderHelper( root ); } // Recursive method to perform inorder traversal private void inorderHelper( TreeNode node ) { if ( node == null ) return; inorderHelper( node.left ); System.out.print( node.data + " " ); inorderHelper( node.right ); } // Postorder Traversal public void postorderTraversal() { postorderHelper( root ); } // Recursive method to perform postorder traversal private void postorderHelper( TreeNode node ) { if ( node == null ) return; postorderHelper( node.left ); postorderHelper( node.right ); System.out.print( node.data + " " ); } }