使用java泛型实现二叉排序树(Binary Sort Tree)
定义
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
实现二叉排序树
定义一个接口(tree):
public interface Tree<E extends Comparable<E>> {
public boolean search(E e);
public boolean insert(E e);
public boolean delete(E e);
public void inorder();
public void postorder();
public void preorder();
public int getSize();
public boolean isEmpty();
public java.util.Iterator iterator();
}
定义一个抽象类(AbstractTree)继承tree接口:
public abstract class AbstractTree<E extends Comparable<E>> implements Tree<E>{
public void inorder() {
}
public void postorder() {
}
public void preorder() {
}
public boolean isEmpty() {
return getSize() == 0;
}
public java.util.Iterator iterator() {
return null;
}
}
定义一个BinaryTree类继承抽象类:
import java.util.*;
public class BinaryTree<E extends Comparable<E>> extends AbstractTree<E>{
protected TreeNode<E> root;
protected int size = 0;
public BinaryTree() {
}
public BinaryTree (E[] objects) {
for(int i = 0; i < objects.length; i++) {
insert(objects[i]);
}
}
public boolean search(E e) {
TreeNode<E> current = root;
while(current != null) {
if(e.compareTo(current.element) < 0) {
current = current.left;
} else if(e.compareTo(current.element) > 0) {
current = current.right;
} else
return true;
}
return false;
}
public boolean insert(E e) {
if(root == null)
root = creaNewNode(e);
else {
TreeNode<E> parent = null;
TreeNode<E> current = root;
while(current != null) {
if(e.compareTo(current.element) < 0) {
parent = current;
current = current.left;
} else if (e.compareTo(current.element) > 0) {
parent = current;
current = current.right;
} else {
return false;
}
}
if(e.compareTo(parent.element) < 0)
parent.left = creaNewNode(e);
else
parent.right = creaNewNode(e);
}
size++;
return true;
}
protected TreeNode<E> creaNewNode(E e) {
return new TreeNode<E>(e);
}
public void inorder() {
inorder(root);
}
public void postorder() {
postorder(root);
}
public void preorder() {
preorder(root);
}
public boolean isEmpty() {
return getSize() == 0;
}
protected void inorder(TreeNode<E> root) {
if(root == null)
return;
else {
inorder(root.left);
System.out.print(root.element + " ");
inorder(root.right);
}
}
protected void postorder(TreeNode<E> root) {
if(root == null) return;
postorder(root.left);
postorder(root.right);
System.out.print(root.element + " ");
}
protected void preorder(TreeNode<E> root) {
if(root == null) return;
System.out.print(root.element + " ");
preorder(root.left);
preorder(root.right);
}
public static class TreeNode<E extends Comparable<E>> {
//内部类
E element;
TreeNode<E> left;
TreeNode<E> right;
public TreeNode(E e) {
element = e;
}
}
public int getSize() {
return size;
}
public TreeNode getRoot() {
return root;
}
//返回从根节点到指定节点的路径
public ArrayList<TreeNode<E>> path(E e) {
ArrayList<TreeNode<E>> list = new ArrayList<TreeNode<E>>();
TreeNode<E> current = root;
while(current != null) {
list.add(current);
if(e.compareTo(current.element) < 0) {
current = current.left;
} else if(e.compareTo(current.element) > 0){
current = current.right;
} else {
break;
}
}
return list;
}
public boolean delete(E e) {
TreeNode<E> parent = null;
TreeNode<E> current = root;
while(current != null) {
if(e.compareTo(current.element) < 0) {
parent = current;
current = current.left;
} else if(e.compareTo(current.element) > 0) {
parent = current;
current = current.right;
} else {
break;
}
}
if(current == null) {
return false;
}
if(current.left == null) {
if(parent == null) {
root = current.right;
} else {
if(e.compareTo(parent.element) < 0)
parent.left = current.right;
else
parent.right = current.right;
}
} else {
TreeNode<E> parentOfRightMost = current;
TreeNode<E> rightMost = current.left;
while(rightMost.right != null) {
parentOfRightMost = rightMost;
rightMost = rightMost.right;
}
current.element = rightMost.element;
if(parentOfRightMost.right == rightMost)
parentOfRightMost.right = rightMost.left;
else
parentOfRightMost.left = rightMost.left;
}
size--;
return true;
}
public Iterator iterator() {
return InorderIterator();
}
public Iterator InorderIterator() {
return new InorderIterator();
}
class InorderIterator implements Iterator {
ArrayList<E> list = new ArrayList<E>();
private int current = 0;
public InorderIterator() {
inorder();
}
public void inorder() {
inorder(root);
}
public void inorder(TreeNode<E> root) {
if(root == null) return;
inorder(root.left);
list.add(root.element);
inorder(root.right);
}
public boolean hasNext() {
if(current < list.size())
return true;
return false;
}
public Object next() {
return list.get(current++);
}
public void remove() {
delete(list.get(current));
list.clear();
inorder();
}
}
public void clear() {
root = null;
size = 0;
}
}
实例运行主程序:
import java.util.ArrayList;
public class TestBinaryTree {
public static void main(String[] args) {
BinaryTree<String> tree = new BinaryTree<String>();
tree.insert("wu");
tree.insert("wang");
tree.insert("li");
tree.insert("zhang");
tree.insert("zhou");
tree.insert("he");
System.out.print("InOrder (sorted): ");
tree.inorder();
System.out.print("\nPostOrder (sorted): ");
tree.postorder();
System.out.print("\nPreOrder (sorted): ");
tree.preorder();
System.out.println("\nThe number of nodes is " + tree.getSize());
System.out.println("\nIs wu in the tree? " + tree.search("zhou"));
System.out.print("\nA path from the root to wu is: ");
ArrayList<BinaryTree.TreeNode<String>> path = tree.path("zhou");
for(int i = 0; path != null && i < path.size(); i++) {
System.out.print(path.get(i).element + " ");
}
}
}
运行结果如下:
InOrder (sorted): he li wang wu zhang zhou
PostOrder (sorted): he li wang zhou zhang wu
PreOrder (sorted): wu wang li he zhang zhou
The number of nodes is 6
Is wu in the tree? true
A path from the root to wu is: wu zhang zhou

Comments