Binary Search Tree 二叉查找树
二叉查找树一种二叉树结构,其左子树比根节点小,右子树比根节点大。
定义接口
/**
* 定义二叉查找树的接口。元素是可比较的。
* 定义操作:判空、大小、包含、添加、删除、前序遍历、中序遍历、后续遍历
*/
public interface BinarySearchTree <T extends Comparable<T>> {
public boolean isEmpty();
public int size();
public boolean contains(T item);
public void add(T item);
public void remove(T item);
public List<T> preorder();
public List<T> inorder();
public List<T> postorder();
public List<T> levelorder();
}
递归实现
/**
* 二叉查找树的递归实现
*/
public class BSTRecursive<T extends Comparable<T>> implements BinarySearchTree<T> {
private Node<T> root;
private int size;
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public int size() {
return size;
}
@Override
public boolean contains(T item) {
return containsRecursive(root, item);
}
private boolean containsRecursive(Node<T> root,T item) {
if (root == null) {
return false;
}
int cmp = root.item.compareTo(item);
// 如果root大于item,查左子树
if (cmp > 0) {
return containsRecursive(root.left, item);
} else if(cmp == 0) {
return true;
} else {
return containsRecursive(root.right, item);
}
}
@Override
public void add(T item) {
root = addRecursive(root, item);
}
private Node<T> addRecursive(Node<T> root, T item) {
if (root == null) {
size++;
return new Node<T>(item);
}
int cmp = root.item.compareTo(item);
if (cmp > 0) {
root.left = addRecursive(root.left, item);
} else if(cmp < 0) {
root.right = addRecursive(root.right, item);;
}
return root;
}
@Override
public void remove(T item) {
root = removeRecursive(root, item);
}
// 删除时,是用右子树最小的来替换
private Node<T> removeRecursive(Node<T> root, T item) {
if (root == null) {
return null;
}
int cmp = root.item.compareTo(item);
if (cmp > 0) {
root.left = removeRecursive(root.left, item);
} else if(cmp < 0) {
root.right = removeRecursive(root.right, item);
} else {
size--;
if (root.left == null) {
return root.right;
}
if (root.right == null) {
return r

本文介绍了二叉查找树的概念,这是一种特殊的二叉树,其中每个节点的左子树上的所有节点值都小于该节点,而右子树上的节点值都大于该节点。文章还涉及到二叉查找树的删除操作,包括三种不同情况的处理策略。
最低0.47元/天 解锁文章
969

被折叠的 条评论
为什么被折叠?



