public class BinaryNode implements BinaryNodeInterface { private T data; private BinaryNode left; private BinaryNode right; public BinaryNode(T dataPortion, BinaryNode leftChild, BinaryNode rightChild) { data = dataPortion; left = leftChild; right = rightChild; } public BinaryNode(T dataPortion) { this(dataPortion, null, null); } public BinaryNode() { this(null); } public T getData() { return data; } public void setData(T newData) { data = newData; } public BinaryNodeInterface getLeftChild() { return left; } public BinaryNodeInterface getRightChild() { return right; } public void setLeftChild(BinaryNodeInterface leftChild) { left = (BinaryNode) leftChild; } public void setRightChild(BinaryNodeInterface rightChild) { right = (BinaryNode) rightChild; } public boolean hasLeftChild() { return left != null; } public boolean hasRightChild() { return right != null; } public boolean isLeaf() { return left == null && right == null; } public int getNumberOfNodes() { int leftNumber = 0; int rightNumber = 0; if(left != null) leftNumber = left.getNumberOfNodes(); if(right != null) rightNumber = right.getNumberOfNodes(); return 1 + leftNumber + rightNumber; } public int getHeight() { return getHeight(this); } private int getHeight(BinaryNode node) { int height = 0; if(node != null) { height = 1 + Math.max(getHeight(node.left), getHeight(node.right)); } return height; } }