JAVA实现二叉树
GitHub
package DataStructure.tree;
import java.util.LinkedList;
import java.util.Queue;
public class BinaryTree<E> {
protected int size;
protected Node<E> root;
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void clear() {
root = null;
size = 0;
}
public void preorder(Visitor<E> visitor) {
if (visitor == null) return;
preorder(root, visitor);
}
public void preorder(Node<E> node, Visitor<E> visitor) {
if (node == null || visitor.stop == true) {
return;
}
visitor.stop = visitor.visit(node.element);
preorder(node.left, visitor);
preorder(node.right, visitor);
}
public void inorder(Visitor<E> visitor) {
if (visitor == null) return;
inorder(root, visitor);
}
public void inorder(Node<E> node, Visitor<E> visitor) {
if (node == null || visitor.stop) return;
inorder(node.left, visitor);
if (visitor.stop) return;
visitor.stop = visitor.visit(node.element);
inorder(node.right, visitor);
}
public void postorder(Visitor<E> visitor) {
if (visitor == null) return;
postorder(root, visitor);
}
public void postorder(Node<E> node, Visitor<E> visitor) {
if (node == null || visitor.stop) return;
postorder(node.left, visitor);
if (visitor.stop) return;
postorder(node.right, visitor);
if (visitor.stop) return;
visitor.stop = visitor.visit(node.element);
}
public void levelOrder(Visitor<E> visitor) {
if (root == null || visitor.stop) return;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node<E> node = queue.poll();
visitor.stop = visitor.visit(node.element);
if (visitor.stop) return;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
public boolean isComplete() {
if (root == null) return false;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);
boolean isLeaf = false;
while (!queue.isEmpty()) {
Node<E> node = queue.poll();
if (isLeaf && !node.isLeaf()) return false;
if (node.left == null && node.right != null) return false;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
} else {
isLeaf = true;
}
}
return true;
}
public int height() {
if (root == null) return 0;
int height = 0;
int levelSize = 1;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node<E> node = queue.poll();
levelSize--;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
if (levelSize == 0) {
levelSize = queue.size();
height++;
}
}
return height;
}
public int height2() {
return height(root);
}
private int height(Node<E> node) {
if (node == null) {
return 0;
}
return 1 + Math.max(height(node.left), height(node.right));
}
protected Node<E> predecessor(Node<E> node) {
if (node == null) return null;
Node<E> p = node.left;
if (p != null) {
while (p.right != null) {
p = p.right;
}
return p;
}
while (node.parents != null && node == node.parents.left) {
node = node.parents;
}
return node.parents;
}
protected Node<E> sucessor(Node<E> node) {
if (node == null) return null;
Node<E> successor = node.right;
if (successor != null) {
while (successor.left != null) {
successor = successor.left;
}
return successor;
}
while (node.parents != null && node == node.parents.right) {
node = node.parents;
}
return node.parents;
}
public static abstract class Visitor<E> {
boolean stop;
abstract boolean visit(E element);
}
protected static class Node<E> {
E element;
Node<E> left;
Node<E> right;
Node<E> parents;
public Node(E element, Node parents) {
this.element = element;
this.parents = parents;
}
public boolean isLeaf() {
return left == null && right == null;
}
public boolean hasTwoChildren() {
return left != null && right != null;
}
}
}
JAVA实现二叉搜索树
package DataStructure.tree;
import java.util.Comparator;
public class BST<E> extends BinaryTree<E> {
private Comparator<E> comparator;
public BST() {
this(null);
}
public BST(Comparator<E> comparator) {
this.comparator = comparator;
}
public void add(E element) {
elementNotNullCheck(element);
if (root == null) {
Node<E> node = new Node<>(element, null);
root = node;
size++;
return;
}
Node<E> parent = root;
Node<E> node = root;
int cmp = 0;
do {
cmp = compare(element, node.element);
parent = node;
if (cmp > 0) {
node = node.right;
} else if (cmp < 0) {
node = node.left;
} else {
node.element = element;
return;
}
} while (node != null);
Node<E> newNode = new Node(element, parent);
if (cmp > 0) {
parent.right = newNode;
} else {
parent.left = newNode;
}
size++;
}
public void remove(E element) {
remove(node(element));
}
public boolean contains(E element) {
return node(element) != null;
}
private void remove(Node<E> node) {
if (node == null) return;
size--;
if (node.hasTwoChildren()) {
Node<E> s = sucessor(node);
node.element = s.element;
node = s;
}
Node<E> replacement = node.left != null ? node.left : node.right;
if (replacement != null) {
replacement.parents = node.parents;
if (node.parents == null) {
root = replacement;
} else if (node == node.parents.left) {
replacement.parents.left = replacement;
} else {
replacement.parents.right = replacement;
}
} else if (node.parents == null) {
root = null;
} else {
if (node == node.parents.left) {
node.parents.left = null;
} else {
node.parents.right = null;
}
}
}
private Node<E> node(E element) {
Node<E> node = root;
while (node != null) {
int cmp = compare(element, node.element);
if (cmp > 0) {
node = node.left;
} else if (cmp < 0) {
node = node.right;
} else {
return node;
}
}
return null;
}
private int compare(E e1, E e2) {
if (comparator != null) {
return comparator.compare(e1, e2);
}
return ((Comparable<E>) e1).compareTo(e2);
}
private void elementNotNullCheck(E element) {
if (element == null) {
throw new IllegalArgumentException("element must not be null");
}
}
}