package com.nitasty.util; /** * * @author DYJ ����д������ʱ���Ҿ���һ������һ���ڲ�ͣ��˵666666 * * @param <E> ������ʵ����Comparable���� */ public class BinaryTree<E extends Comparable<? super E>> { private BinaryNode<E> root; public BinaryTree(){ this.root=null; } public BinaryTree(BinaryNode root) { this.root = root; } public void makeEmpty(){ root=null; } public boolean isEmpty(){ return root==null; } public int getHeight(){ return height(root); } public boolean contains(E x){ return contains(x,root); } public <E> E findMin(){ if(isEmpty()) throw new NullPointerException();//�׸�ʲô��������أ�TODO return (E) findMin(root).data; //ΪʲôҪ��ת�ͣ� } public <E> E findMax(){ if(isEmpty()) throw new NullPointerException();//�׸�ʲô��������أ�TODO return (E) findMax(root).data;//ΪʲôҪ��ת�ͣ� } public void insert(E x){ root=insert(x,root);//ΪɶҪ��root�ӷ���ֵ����Ϊ�ⷽ���ǵݹ�� } public void remove(E x){ root=remove(x,root);//ΪɶҪ��root�ӷ���ֵ����Ϊ�ⷽ���ǵݹ�� } //��ӡ����data public void printTree(){ if(isEmpty()) System.out.println("Empty tree"); else printTree(root); } public void printTreeStructure(){ if(isEmpty()) System.out.println("Empty tree"); else printTreeStructure(root,0); } private void printTreeStructure(BinaryNode<E> t,int i) { StringBuffer buff=new StringBuffer(); if(t!=null){ for(int j=0;j<i;j++) buff.append("="); System.out.println(buff.append(t.data)); printTreeStructure(t.left,i+1); printTreeStructure(t.right,i+1); } } private boolean contains(E x, BinaryNode<E> t) { if(t==null) return false; int compareResult=x.compareTo(t.data); if(compareResult<0){ return contains(x,t.left);//�ݹ�������������Ƚ� }else if(compareResult>0){ return contains(x,t.right);//�ݹ�������������Ƚ� }else{ return true; } } private BinaryNode<E> findMin(BinaryNode<E> t) { if(t==null) return null; else if(t.left==null) return t; return findMin(t.left);//�ݹ������С������ } private BinaryNode<E> findMax(BinaryNode<E> t) { if(t==null) return null; else if(t.right==null){ return t; } return findMax(t.right);//�ݹ������������� } private BinaryNode<E> insert(E x, BinaryNode<E> t) { if(t==null) return new BinaryNode<E>(x); int compareResult=x.compareTo(t.data); if(compareResult<0) t.left=insert(x,t.left); else if(compareResult>0) t.right=insert(x,t.right); else ;//�ظ��ˣ���ʱɶ�����ɣ����ԼӸ��ռ������ظ��� return t;//����ԭ�������� } /** * ���ү��̫���� * @param x * @param t * @return */ private BinaryNode<E> remove(E x, BinaryNode<E> t) { // TODO Auto-generated method stub if(t==null) return t; //x�����ڣ�ɶ������ int compareResult=x.compareTo(t.data); if(compareResult<0) t.left=remove(x,t.left); else if(compareResult>0) t.right=remove(x,t.right); else if(t.left!=null && t.right!=null){ //���������� t.data=findMin(t.right).data; t.right=remove(t.data,t.right);//������ݹ��ˡ����Ҳ� } else t=(t.left!=null)? t.left:t.right; //ֻ��һ�����ӣ������ӷ���ɾ���Ľڵ㴦��û�к�����Ϊ�գ�������Ҫ���е������� return t; //�ݹ����� } private int height(BinaryNode<E> t){ if(t==null) return -1; else return 1+Math.max(height(t.left),height(t.right)); //����ݹ�̫��������ˣ����� } private void printTree(BinaryNode t){//������� if(t!=null){ printTree(t.left); System.out.println(t.data); printTree(t.right); } } public static class BinaryNode<E>{ private E data; private BinaryNode<E> left; private BinaryNode<E> right; //�½��ڵ������data,left,right BinaryNode(E data, BinaryNode<E> left, BinaryNode<E> right) { this.data = data; this.left = left; this.right = right; } //left��right����Ϊnull BinaryNode(E data){ this(data, null, null); } } }