数据结构之二叉搜索树(C#版)

本文介绍了二叉搜索树的概念、特点,并以C#为例详细阐述其查找、插入和删除操作的实现原理。通过递归方法,展示了如何在二叉搜索树中高效地进行数据操作,强调了二叉搜索树在搜索效率上的优势。
摘要由CSDN通过智能技术生成

什么是二叉搜索树

首先,搜索二叉树,字面理解,它必须先是一课二叉树(如果不知道什么是二叉树可以参考我的另外一篇文章数据结构之二叉树(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 BinarySearchTree(BinaryTreeNode<T>
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值