二叉查找树,实现

public class BinaryTree<Element extends Comparable<? super Element>> {
	
	//根节点
	private BinaryNode<Element> root;

	
	//移除一个元素
	public void remove(Element element){
		root = remove(element,root);
	}
	
	/**
	 * 移除一个节点 分三种情况,
	 * 一个是 该节点本身是叶子,
	 * 一个是 该节点含有一个儿子节点
	 * 一个是 该节点还有两个儿子节点
	 * @param e
	 * @param comareElement
	 */
	private BinaryNode<Element> remove(Element e, BinaryNode<Element> comareElement) {
		if (comareElement == null) {
			return comareElement;
		}
		
		int compareTo = e.compareTo(comareElement.element);//要删除的元素 和当前元素进行比较
		
		if (compareTo == 1) {//说明要删除的元素 在当前节点 的右边
			comareElement.right = remove(e, comareElement.right); //等式的左边保留的是当前比较节点的父节点的引用
		}else if (compareTo == -1) {//说明要删除的元素 在当前节点 的左边
			comareElement.left = remove(e, comareElement.left);   //等式的左边保留的是当前比较节点的父节点的引用
		}else if (compareTo == 0) {
			//当要删除的节点是叶子的时候 直接置为null
			if (comareElement.left == null  &&  comareElement.right == null) {
				comareElement = null;
			} else if (comareElement.left == null) {
			//要删除的节点的左子节点为空的情况
				comareElement = comareElement.right;
			}else if (comareElement.right == null){
			//要删除的节点的右子节点为空的情况
				comareElement = comareElement.left;
			}else {
			//要删除的节点的 左右儿子节点都不为空的情况。	删除的节点 用右子树中最小节点替代,当然也可以用其他节点替代
				BinaryNode<Element>	min = findMin(comareElement);//右子树中最小节点
				Element element =  min.element;//右子树中的元素
				comareElement.element = element;//将右子树的值赋值给,当前找到元素的值。
				comareElement.right = remove(element, comareElement.right);//将最小节点删掉
				
			}
			
		}
		return comareElement;
	}
	
	private BinaryNode<Element>  findMin(BinaryNode<Element> element){//查找并返回一个输入元素 最小子节点
		if (element == null) {
			return null;
		}else if (element.left == null) {//左节点无值,说明该节点就是最小值
			return element;
		}else if (element.left != null) {
			return findMin(element.left);
		}
		return null;
	}


	//插入一个元素
	public void insert(Element element){
		
		root = insert(element,root);
	}
	
	private BinaryNode<Element> insert(Element e, BinaryNode<Element> comareElement) {
		
		if (comareElement == null) {//根节点无值,或者当前节点无值,说明要插入
			comareElement = new BinaryNode<Element>(e,null,null);
			return comareElement;
		}
		
		int compareTo = e.compareTo(comareElement.element);//要查找的元素 和当前元素进行比较
		
		if (compareTo == 1) {//说明要插入的值要 在当前比较节点的右边
			comareElement.right = insert(e, comareElement.right);
		}else if (compareTo == -1) {//说明要插入的值 在当前比较节点的左边
			comareElement.left = insert(e, comareElement.left);
		}else if (compareTo == 0 ) {//说明当前 插入的值存在
			return null;
		}
		return comareElement;
	}

	//是否包含某一个元素
	public Boolean contains(Element element){
		
		return contains(element,root);
	}

	
	private Boolean contains(Element e, BinaryNode<Element> comareElement) {
		if (comareElement == null) {
			return false;
		}
		
		int compareTo = e.compareTo(comareElement.element);//要查找的元素 和当前元素进行比较
		
		if (compareTo == 1) {//说明在右边
			return contains(e, comareElement.right);//进行递归
		}else if (compareTo == -1) {//说明在左边
			return  contains(e, comareElement.left);
		}
		
		return true; //说明找到了当前节点
	}


	//节点的 左节点小 右节点大
	private static class  BinaryNode<Element>{ //一个二叉树节点
		private Element element;
		private BinaryNode<Element> left;
		private BinaryNode<Element> right;
		public BinaryNode(Element element, BinaryNode<Element> left, BinaryNode<Element> right) {
			super();
			this.element = element;
			this.left = left;
			this.right = right;
		}
	}
	
	
	
	public static void main(String[] args) {
		BinaryTree<Integer> binaryTree = new BinaryTree<Integer>();
		binaryTree.insert(6);
		binaryTree.insert(2);
		binaryTree.insert(8);
		binaryTree.insert(1);
		binaryTree.remove(2);

	}

猜你喜欢

转载自blog.csdn.net/woyixinyiyi/article/details/79594936