package com.xusheng.tree; /** * 实现二叉查找树 * @author xusheng * * @param <T> */ public class BinarySearchTree<T extends Comparable<? super T>> { private BinaryNode<T> root; public BinarySearchTree() { this.root = null; } public boolean isEmpty(){ return this.root == null; } public void insert(T element){ root = insert(element,root); } private BinaryNode<T> insert(T element,BinaryNode<T> node){ if(node == null){ return new BinaryNode<T>(element,null,null); } int intCompare = element.compareTo(node.data); if(intCompare < 0){ node.leftNode = insert(element,node.leftNode); }else if(intCompare > 0){ node.rightNode = insert(element,node.rightNode); } return node; } public boolean contains(T element){ return contains(element,root); } private boolean contains(T element,BinaryNode<T> node){ if(node == null){ return false; } int intCompare = element.compareTo(node.data); if(intCompare < 0){ return contains(element,node.leftNode); }else if(intCompare > 0){ return contains(element,node.rightNode); }else{ return true; } } public void remove(T element){ remove(element,root); } private BinaryNode<T> remove(T element,BinaryNode<T> node){ if(node == null){ return node; } int intCompare = element.compareTo(node.data); if(intCompare < 0){ node.leftNode = remove(element,node.leftNode); }else if(intCompare > 0){ node.rightNode = remove(element,node.rightNode); } else if(node.leftNode != null && node.rightNode != null){ node.data = findMin(node).data; node.rightNode = remove(node.data,node.rightNode); }else{ node = (node.leftNode != null) ? node.leftNode : node.rightNode; } return node; } private BinaryNode<T> findMin(BinaryNode<T> node){ if(node == null){ return null; }else if(node.leftNode == null){ return node; }else{ return findMin(node.leftNode); } } private BinaryNode<T> findMax(BinaryNode<T> node){ if(node == null){ return null; } while(node.rightNode != null){ node = node.rightNode; } return node; } private class BinaryNode<T>{ private T data; private BinaryNode<T> leftNode; private BinaryNode<T> rightNode; public BinaryNode(T data, BinaryNode<T> leftNode,BinaryNode<T> rightNode) { this.data = data; this.leftNode = leftNode; this.rightNode = rightNode; } public BinaryNode(T element) { this(element,null,null); } } }