欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

泛型二叉排序树

程序员文章站 2022-04-05 14:51:47
...

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Stack;

/**
* <p>
* This class is used to store Element that implements the interface of
* Comparable to a Binary Sorted Tree
*
* @param <E>
*            the type of elements stored in the tree
* @author Jay Chang
* @version 1.0, 08/14/09
* @see Iterator
* @see Comparable
* @see Stack
*/
public class SortedBiTree<E extends Comparable<E>> {

/** 内部类,定义二叉排序树的结点 */
private static class SortedBiTreeNode<E> {
   private E element;
   private SortedBiTreeNode<E> lChild;
   private SortedBiTreeNode<E> rChild;

   private SortedBiTreeNode(E element) {
    this.element = element;
    this.lChild = null;
    this.rChild = null;
   }

   public E getelement() {
    return this.element;
   }
}

/** 树根结点 */
private SortedBiTreeNode<E> root;

/** 树的元素个数 */
private int capacity;

public SortedBiTree() {
   this.capacity = 0;
}

/**
* @function 添加一个元素
* @param E类型的元素
* @return 若元素存在返回true,否则返回false
*/
public boolean add(E element) {
   if (this.isExist(element)) {
    return false;
   }
   this.create(element);
   return true;
}

/**
* @function 添加一个集合
* @param Collecton集合且,集合内元素必须是E类型
* @return 若Collection集合的元素没有一个添加成功则返回false,否则返回true
*/
public boolean addAll(Collection<E> c) {
   Iterator<E> it = c.iterator();
   int count = 0;
   while (it.hasNext()) {
    E element = it.next();
    if (!this.isExist(element)) {
     add(element);
     count++;
    }
   }
   return count >= 1 ? true : false;
}

/**
* @function 私有方法,用于协助获得添加元素后的树
* @param E类型的元素
* @return void
*/
private void create(E element) {
   this.root = this.createSortedBiTree(this.root, element);
}

/**
* @function 私有方法,用于协助判断是否存在指定的元素
* @param E类型的元素
* @return 存在返回true, 否则返回false
*/
private boolean isExist(E element) {
   SortedBiTreeNode<E> tempNode = this.root;
   while (tempNode != null) {
    if (tempNode.element.compareTo(element) > 0) {
     tempNode = tempNode.lChild;
    } else if (tempNode.element.compareTo(element) < 0) {
     tempNode = tempNode.rChild;
    } else {
     return true;
    }
   }
   return false;
}

/**
* @function 私有方法用于实现添加一个元素,且遵循二叉排序树原则
* @param SortedBiTreeNode
*            <E>类型的结点
* @param E类型元素
* @return SortedBiTreeNode<E>类型的结点
*/
private SortedBiTreeNode<E> createSortedBiTree(SortedBiTreeNode<E> node,
    E element) {
   if (node == null) {
    node = new SortedBiTreeNode<E>(element);
    this.capacity++;
   }
   if (node.element.compareTo(element) < 0) {
    node.rChild = createSortedBiTree(node.rChild, element);
   } else if (node.element.compareTo(element) > 0) {
    node.lChild = createSortedBiTree(node.lChild, element);
   }
   return node;
}

/**
* @function 判断树是否为空
* @param none
* @return 若为空,返回true,否则返回false
*/
public boolean isEmpty() {
   return this.root == null;
}

/**
* @function 判断是否存在指定元素
* @param E类型元素
* @return 存在返回true,否则返回false
*/
public boolean contains(E element) {
   if (this.isExist(element)) {
    return true;
   } else {
    return false;
   }
}

/**
* @function 判断是否存在指定集合内的所有元素
* @param Collection
*            <E>
* @return 存在返回true,否则返回false
*/
public boolean containsAll(Collection<E> c) {
   if (this.isEmpty())
    return false;
   Iterator<E> it = c.iterator();
   while (it.hasNext()) {
    if (!this.isExist(it.next())) {
     return false;
    }
   }
   return true;
}

/**
* @function 得到E类型元素最小的那个结点的元素,即树的最左下角的元素
* @param none
* @return SortedBiTreeNode<E>类型的结点
*/
public E getMin() {
   if (this.isEmpty())
    return null;
   SortedBiTreeNode<E> tempNode = this.root;
   SortedBiTreeNode<E> pref = null;
   while (tempNode != null) {
    pref = tempNode;
    tempNode = tempNode.lChild;
   }
   return pref.element;
}

/**
* @function 中序遍历后得到有序的E类型数组
* @param none
* @return E类型的数组
*/
public E[] toArray(E[] a) {
   Object[] elements = new Object[this.capacity];
   int count = 0;
   Stack<SortedBiTreeNode<E>> stack = new Stack<SortedBiTreeNode<E>>();
   SortedBiTreeNode<E> pCurrent = this.root;
   while (pCurrent != null || !stack.isEmpty()) {
    if (pCurrent != null) {
     stack.push(pCurrent);
     pCurrent = pCurrent.lChild;
    } else {
     pCurrent = stack.peek().rChild;
     elements[count++] = stack.pop().element;
    }
   }
   return (E[]) Arrays.copyOf(elements, this.capacity, a.getClass());
   // 下面是在ArrayList里找到的返回泛型数组的源代码,可是自己觉得只需要上面一行就够了
   // 首先传进E[] a是肯定需要的,因为在本方法体内不能够new一个泛型数组,需要在调用此方
   // 法时,传进来,然后可以通过复制的方法,并可数组长度,觉得一句足以完成下面7句,而无需
   // 判断,数组a的长度,与sortedBiTree的元素个数,最终一定返回的是数组的长度为sortedBiTree
   // 的长度,而且当a.length大于等于this.capacity时,返回的数组长度是a.length的,而
   // 调用者应该想得到的是sortedBiTree的元素个数
   /*
   * if (a.length < this.capacity) return (T[])
   * Arrays.copyOf(elementData,this.capacity, a.getClass());
   * System.arraycopy(elements, 0, a, 0,this.capacity); if (a.length >
   * size) a[capacity] = null; return a;
   */
}

/**
* @function 得到E类型元素最大的那个结点的元素,
* @param none
* @return SortedBiTreeNode<E>类型的结点
*/
public E getMax() {
   if (this.isEmpty())
    return null;
   SortedBiTreeNode<E> tempNode = this.root;
   SortedBiTreeNode<E> pref = null;
   while (tempNode != null) {
    pref = tempNode;
    tempNode = tempNode.rChild;
   }
   return pref.element;
}

/**
* @function 得到树的元素个数
* @param none
* @return 返回树的结点个数
*/
public int size() {
   return this.capacity;
}
}

相关标签: C C++ C#