packageCTCI;/* One node of a binary tree. The data element stored is a single * character. */publicclassTreeNode{publicintdata;publicTreeNodeleft;publicTreeNoderight;publicTreeNodeparent;privateintsize=0;publicTreeNode(intd){data=d;size=1;}publicvoidsetLeftChild(TreeNodeleft){this.left=left;if(left!=null){left.parent=this;}}publicvoidsetRightChild(TreeNoderight){this.right=right;if(right!=null){right.parent=this;}}publicvoidinsertInOrder(intd){if(d<=data){if(left==null){setLeftChild(newTreeNode(d));}else{left.insertInOrder(d);}}else{if(right==null){setRightChild(newTreeNode(d));}else{right.insertInOrder(d);}}size++;}publicintsize(){returnsize;}publicbooleanisBST(){if(left!=null){if(data<left.data||!left.isBST()){returnfalse;}}if(right!=null){if(data>=right.data||!right.isBST()){returnfalse;}}returntrue;}publicintheight(){intleftHeight=left!=null?left.height():0;intrightHeight=right!=null?right.height():0;return1+Math.max(leftHeight,rightHeight);}publicTreeNodefind(intd){if(d==data){returnthis;}elseif(d<=data){returnleft!=null?left.find(d):null;}elseif(d>data){returnright!=null?right.find(d):null;}returnnull;}privatestaticTreeNodecreateMinimalBST(intarr[],intstart,intend){if(end<start){returnnull;}intmid=(start+end)/2;TreeNoden=newTreeNode(arr[mid]);n.setLeftChild(createMinimalBST(arr,start,mid-1));n.setRightChild(createMinimalBST(arr,mid+1,end));returnn;}publicstaticTreeNodecreateMinimalBST(intarray[]){returncreateMinimalBST(array,0,array.length-1);}publicvoidprint(){BTreePrinter.printNode(this);}}