什么是二叉搜索树
首先,搜索二叉树,字面理解,它必须先是一课二叉树(如果不知道什么是二叉树可以参考我的另外一篇文章数据结构之二叉树(C#版)),因为二叉搜索树是建立在二叉树的基础上的,所以我直接用猿话版来解释好了。
猿话版:
1.树中的任意两个节点的关键字(值)都不相同;
2.根节点的左子树中,元素的关键字(值)都小于根节点的关键字(值),其实就是节点的左子节点的关键字(值)小于节点的关键字(值);
3.根节点的右子树中,元素的关键字(值)都大于根节点的关键字(值),其实就是节点的左子节点的关键字(值)大于节点的关键字(值);
4.根节点的左右子树,仍是二叉搜索树。
为什么要有二叉搜索树
首先,听名字就知道了,就是为了用于搜索的二叉树,它跟二叉树最大的区别是什么?
如果从二叉树中查找一个值,那最坏的情况,就是把整棵二叉树(有n个节点)都遍历一遍,它的时间复杂度就是O(n),但是,如果从二叉搜索树中查找一个值呢?因为二叉搜索树的特性,每遍历一次,相当于将范围就缩小了一半(如果比节点值小,就遍历左子树就好了,如果比节点值大,就遍历右子树就好了,就不需要把左右子树都遍历一次),所以它的时间复杂度就是O(log n)。
二叉搜索树的结构
二叉搜索树的节点结构跟二叉树基本上是没有区别,我这里的二叉搜索树类,限定了节点的数据类型,必须是实现IComparable接口的,为什么?因为二叉搜索树的节点必须是要可以比较大小的(那IComparable就是用于定义自己的比较大小的方式),如果连大小都不能对比的话,那就GG咯。
节点
我这里的节点跟二叉树的是一样的,因为二叉树和二叉搜索树的区别,并不在节点上,而是在树的结构上。
public class BinaryTreeNode<T> where T:IComparable
{
///<summary>
///节点数据
///<summary>
private T _data;
///<summary>
///左节点
///<summary>
private BinaryTreeNode<T> _leftChild;
///<summary>
///右子节点
///<summary>
private BinaryTreeNode<T> _rightChild;
///<summary>
///节点数据
///<summary>
public T Data
{
get {
return _data; }
set {
_data = value; }
}
///<summary>
///左子节点
///<summary>
public BinaryTreeNode<T> LeftChild
{
get {
return _leftChild; }
set {
_leftChild = value; }
}
///<summary>
///右子节点
///<summary>
public BinaryTreeNode<T> RightChild
{
get {
return _rightChild; }
set {
_rightChild = value; }
}
public BinaryTreeNode() {
}
public BinaryTreeNode(T data)
{
_data = data;
}
public override string ToString() {
return _data.ToString();
}
}
二叉搜索树
public class BinarySearchTree<T> : BinaryTreeBase<T> where T : IComparable
{
private BinaryTreeNode<T> _root;
public override BinaryTreeNode<T> Root {
get {
return _root; } }
///<summary>
///构造函数
///<summary>
///<param>
/// <param name="rootNode">节点</param>
public