package com.cskaoyan.bst;
import sun.reflect.generics.tree.Tree;
import javax.swing.text.AsyncBoxView;
import java.util.ArrayList;
import java.util.List;
/*
增:
boolean add(E e)
删:
boolean remove(E e)
查找:
boolean contains(E e)
E min()
E max()
遍历:
List<E> preOrder()
List<E> inOrder()
List<E> postOrder()
List<E> levelOrder()
获取集合的属性:
int height()
boolean isEmpty()
int size()
建树:
static <T> BinarySearchTree buildTree(List<T> preOrder, List<T> inOrder);
*/
public class BinarySearchTree<E extends Comparable<? super E>> {
// 属性
private TreeNode root;
private int size;
private class TreeNode {
TreeNode left;
E value;
TreeNode right;
public TreeNode(E value) {
this.value = value;
}
public TreeNode(TreeNode left, E value, TreeNode right) {
this.left = left;
this.value = value;
this.right = right;
}
}
/**
* 在BST添加元素e
*
* @param e 待添加的元素
* @return 如果添加成功返回true, 否则返回false
*/
public boolean add(E e) {
/*// 空树
if (root == null) {
root = new TreeNode(e);
size++;
return true;
}
// 根结点不为空
TreeNode p = null;
TreeNode x = root;
int cmp;
do {
cmp = e.compareTo(x.value);
if (cmp == 0) return false;
else if (cmp < 0) {
p = x;
x = x.left;
} else {
p = x;
x = x.right;
}
} while (x != null);
// x == null, 当前位置就是要添加的位置
if (cmp < 0) p.left = new TreeNode(e);
else p.right = new TreeNode(e);
size++;
return true;*/
// 递归实现
int oldSize = size;
root = add(root, e);
return size > oldSize;
}
private TreeNode add(TreeNode node, E e) {
if (node == null) {
size++;
return new TreeNode(e);
}
int cmp = e.compareTo(node.value);
// 通过赋值语句把新建的结点链接起来的
if (cmp < 0) node.left = add(node.left, e);
else if (cmp > 0) node.right = add(node.right, e);
return node;
}
/**
* 删除BST中与指定对象e相等的元素
*
* @param e 指定对象
* @return 如果删除成功返回true, 否则返回false
*/
public boolean remove(E e) {
TreeNode p = null;
TreeNode x = root;
while (x != null) {
int cmp = e.compareTo(x.value);
if (cmp == 0) break;
else if (cmp < 0) {
p = x;
x = x.left;
} else {
p = x;
x = x.right;
}
}
// 没有与指定对象相等的元素 x == null
if (x == null) return false;
// 判断x是不是度为2的结点
if (x.left != null && x.right != null) {
// 将右子树中最小结点替换x结点的值
TreeNode minP = x;
TreeNode minX = x.right;
while (minX.left != null) {
minP = minX;
minX = minX.left;
}
// minX.left == null
// 用右子树中元素替换该结点的元素
x.value = minX.value;
// 删除右子树中最小结点
p = minP;
x = minX;
}
// 删除x结点(度为0或者度为1)
TreeNode child = x.left != null ? x.left : x.right;
// 判断删除的是不是根结点
if (p == null) root = child;
else {
if (p.left == x) p.left = child;
else p.right = child;
}
size--;
return true;
}
public boolean contains(E e) {
TreeNode x = root;
while (x != null) {
int cmp = e.compareTo(x.value);
if (cmp == 0) return true;
else if (cmp < 0) x = x.left;
else x = x.right;
}
// x == null
return false;
}
/**
* 获取BST中最小的元素,如果是空树返回null
*
* @return BST中最小的元素, 如果是空树返回null
*/
public E min() {
if (isEmpty()) return null;
TreeNode x = root;
while (x.left != null) {
x = x.left;
}
// x.left == null
return x.value;
}
/**
* 获取BST中最大的元素,如果是空树返回null
*
* @return BST中最大的元素, 如果是空树返回null
*/
public E max() {
if (isEmpty()) return null;
TreeNode x = root;
while (x.right != null) {
x = x.right;
}
// x.right == null
return x.value;
}
public int size() {
return size;
}
/**
* 判断BST是否是一棵空树
*
* @return 如果BST是空树返回true, 否则返回false
*/
public boolean isEmpty() {
return root == null;
}
public List<E> preOrder() {
// 如果是空树,就返回空集合,不要返回null
List<E> list = new ArrayList<>();
preOrder(root, list);
return list;
}
private void preOrder(TreeNode node, List<E> list) {
if (node == null) return;
// 遍历根节点
list.add(node.value);
// 遍历左子树
preOrder(node.left, list);
// 遍历右子树
preOrder(node.right, list);
}
public List<E> inOrder() {
List<E> list = new ArrayList<>();
inOrder(root, list);
return list;
}
private void inOrder(TreeNode node, List<E> list) {
if (node == null) return;
// 遍历左子树
inOrder(node.left, list);
// 遍历根节点
list.add(node.value);
// 遍历右子树
inOrder(node.right, list);
}
public static void main(String[] args) {
BinarySearchTree<Character> tree = new BinarySearchTree<>();
/*System.out.println(tree.size());
System.out.println(tree.preOrder());
System.out.println(tree.inOrder());*/
tree.add('C');
tree.add('A');
tree.add('D');
tree.add('B');
tree.add('E');
/*System.out.println(tree.size());
System.out.println(tree.preOrder()); // [C, A, B, D, E]
// 中序是排好序的
System.out.println(tree.inOrder()); // [A, B, C, D, E]*/
// contains(E e)
/*System.out.println(tree.contains('A')); // true
System.out.println(tree.contains('X')); // false
System.out.println(tree.contains(null)); // NullPointerException*/
/*System.out.println(tree.isEmpty());
System.out.println(tree.min());
System.out.println(tree.max());*/
// remove()
// 删除度为0
/*System.out.println(tree.remove('B'));
System.out.println(tree.size());
System.out.println(tree.preOrder()); //[C, A, D, E]
System.out.println(tree.inOrder());*/
//删除度为1
/*System.out.println(tree.remove('D'));
System.out.println(tree.size());
System.out.println(tree.preOrder()); //[C, A, B, E]
System.out.println(tree.inOrder());*/
// 删除度为2
/*System.out.println(tree.remove('C'));
System.out.println(tree.size());
System.out.println(tree.preOrder()); //[D, A, B, E]
System.out.println(tree.inOrder());*/
// 删除不存在的
System.out.println(tree.remove('X'));
System.out.println(tree.size());
System.out.println(tree.preOrder()); //[C, A, B, D, E]
System.out.println(tree.inOrder());
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。