import java.util.Comparator;
/**
* 二叉查找树
*
* @author Jelly
*
* @param <T>
*/
public class BinarySearchTree<T extends Comparable<? super T>> {
private BinaryNode<T> root;
private Comparator<? super T> cmp;
public BinarySearchTree() {
root = null;
}
public BinarySearchTree(Comparator<? super T> c) {
root = null;
cmp = c;
}
private int myComparable(T lhs, T rhs) {
if (cmp != null) {
return cmp.compare(lhs, rhs);
} else {
return lhs.compareTo(rhs);
}
}
public void makeEmpty() {
root = null;
}
public boolean isEmpty() {
return root == null;
}
public boolean contains(T x) {
return contains(x, root);
}
public T findMin() {
if (isEmpty()) {
System.out.println("UndeclaredThrowableException");
}
return findMin(root).element;
}
private BinaryNode<T> findMin(BinaryNode<T> t) {
if (null == t) {
return null;
} else if (null == t.left) {
return t;
}
return findMin(t.left);
}
public T findMax() {
if (isEmpty()) {
System.out.println("UndeclaredThrowableException");
}
return findMax(root).element;
}
private BinaryNode<T> findMax(BinaryNode<T> t) {
if (null != t) {
while (t.right != null) {
t = t.right;
}
}
return t;
}
public void insert(T x) {
insert(x, root);
}
public void remove(T x) {
root = remove(x, root);
}
public void printTree() {
if (isEmpty()) {
System.out.println("Empty tree");
} else {
printTree(root);
}
}
public boolean contains(T x, BinaryNode<T> t) {
if (t == null) {
return false;
}
int compareResult = x.compareTo(t.element);
if (compareResult < 0) {
return contains(x, t.left);
} else if (compareResult < 0) {
return contains(x, t.right);
} else {
return true;
}
}
private BinaryNode<T> insert(T x, BinaryNode<T> t) {
if (t == null) {
return new BinaryNode<T>(x, null, null);
}
int compareResult = x.compareTo(t.element);
if (compareResult < 0) {
t.left = insert(x, t.left);
} else if (compareResult > 0) {
t.right = insert(x, t.right);
}
return t;
}
private BinaryNode<T> remove(T x, BinaryNode<T> t) {
if (t == null) {
return t;
}
int compareResult = x.compareTo(t.element);
if (compareResult < 0) {
t.left = remove(x, t.left);
} else if (compareResult > 0) {
t.right = remove(x, t.right);
} else if (t.left != null && t.right != null) {
t.element = findMin(t.right).element;
t.right = remove(t.element, t.right);
} else {
t = (t.left != null) ? t.left : t.right;
}
return null;
}
private void printTree(BinaryNode<T> t) {
if (t != null) {
printTree(t.left);
System.out.println(t.element);
printTree(t.right);
}
}
private static class BinaryNode<T> {
BinaryNode(T theElement) {
this(theElement, null, null);
}
public BinaryNode(T theElement, BinaryNode<T> lt, BinaryNode<T> rt) {
this.element = theElement;
this.left = lt;
this.right = rt;
}
T element; // The data in the node
BinaryNode<T> left; // Left child
BinaryNode<T> right; // Right child
}
}
分享到:
相关推荐
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...
二叉查找树(Binary Search Tree, BST)是一种基础但非常重要的数据结构,它在计算机科学中扮演着核心角色,尤其是在算法和数据结构的学习中。二叉查找树的主要特性是每个节点的左子树只包含小于该节点的元素,右子...
二叉查找树(Binary Search Tree, BST)是一种特殊的数据结构,它在计算机科学中用于高效地存储和检索数据。在二叉查找树中,每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用以及一个指向右子节点...
在C++编程中,二叉查找树(Binary Search Tree,简称BST)是一种常见的数据结构,它具有以下特性:对于任意节点,其左子树中的所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。这种性质使得...
二叉查找树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,每个节点的键都大于其左子树中的...
二叉查找树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的所有...
用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用
最优二叉查找树(Optimal Binary Search Tree, OBST)是一种高效的检索数据结构,它根据键值分布的不同,自适应地调整树的形态以达到最小化查找时间的目的。在计算机科学中,动态规划(Dynamic Programming, DP)是...
### 一种高效二叉查找树——红黑树 #### 一、引言 在计算机科学领域,二叉查找树(Binary Search Tree, BST)是一种非常重要的数据结构,它能够有效地实现查找、插入和删除等基本操作。然而,在某些情况下,普通的...
标题:最优二叉查找树 描述:算法对最优二叉树的实现(课本上对最优二叉树的基本实现) 在计算机科学中,最优二叉查找树(Optimal Binary Search Tree,简称OBST)是一种特殊的二叉查找树,其设计目标是在平均情况...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上的所有节点的值都大于该节点的值。这样的特性使得...
1、 定义二叉查找树的类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)实现二叉查找树结构; 2) 实现二叉查找树的查找、插入和删除等算法;
### C++ 实现二叉查找树 #### 一、引言 本文将详细介绍如何使用C++来实现一个二叉查找树(Binary Search Tree, BST),包括其基本操作:插入、删除、遍历等,并通过示例代码进行解释。二叉查找树是一种非常重要的数据...
### 一、二叉查找树简介 二叉查找树是一种特殊的二叉树数据结构,它具有以下特性: 1. **左子树**中的所有节点值均小于其根节点的值。 2. **右子树**中的所有节点值均大于其根节点的值。 3. 左右子树也分别满足上述...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都包含一个键值(key)、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的所有节点的键值都...
二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构。它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉查找树中,对于...
二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的...
二叉查找树的常用操作,含C++代码,找工作的时候可以放在手机里看。