一遍快速搞清二叉排序树的构建

目录

什么是二叉排序树?

排序二叉树的性质:

示例图

如何构建一颗二叉排序树

二叉排序树的代码示例:

预告

什么是二叉排序树?

二叉排序树,首先搞清楚它是一种二叉树的类型。而排序二字可以联想到应该跟关键字的排序有关。为什么要进行关键字的排序?排序例如冒泡、插入、快速等等,都是为了一个核心的目的:高效率地查找数据。到这,我们可以先记下:二叉排序树,顾名思义,是让关键字按一定的逻辑顺序排列便于查询的一种二叉树。

排序二叉树的性质

(1)若左子树非空,则左子树上所有结点的值均小于根节点的值。

(2)若右子树非空,则右子树上所有结点的值均大于根节点的值。

(3)左、右子树也分别是一棵二叉排序树。(这个很重要,因为它是递归的原理!!)

(4)二叉排序树不能有重复的值。

示例图

如何构建一颗二叉排序树

这个思路是用到了递归的。我们都知道,创建一颗二叉树可以通过递归完成。二叉排序树也是同样的思路,只是它不会由我们“手动”去设置结点该放左孩子还是右孩子,而是根据性质(左<根<右)插入结点。

这里以空树开始,创建一颗二叉排序树为例:

假设要求按照序列,将{40,72,38,35,67,51}建立一颗二叉排序树,则过程应该是这样的:

 如果说对于插入排序、冒泡排序这些叫做“稳定”的算法(稳定意思是说原本键值一样的元素排序后相对位置不变的时候),那么我想二叉排序树算是另一类的“稳定”(即每次插入结点后,位置不会再发生改变,我自创的---方便记忆吧)。

注意:假设有相同的值,则插不进去,会显示失败(要求结点的每个值具备唯一性)

二叉排序树的代码示例:

int BST_Insert(BiTree &T,KeyType k){
       
     if(T==NULL){               //原树为空,新插入的记录为根结点
  
          T=(BiTree)malloc(sizeof(BSTNode));
          T->data=k;
          T->lchild=T->rchild=NULL;
          return 1;       //返回1,表示插入成功
     }

      else if(k==T->data)  //树中存在相同关键字的结点,插入失败
            
          return 0;

      else if(k<T->data)   //小于,插入到T的左子树(递归)

          return BST_Insert(T->lchlid,k);  

      else if(k>T->data)   //大于,插入到T的右子树(递归)
         
          return BST_Insert(T->rchild,k);

}

预告

二叉排序树的查找算是非常简便的,其查找的次数跟树的深度有关。那么有没有可能存在一棵很深的二叉排序树呢,当然,像这样:

如果查5,那么可知失败查找次数就有4次,如果插100呢。。或者更多,那么很明显,这棵二叉排序就已经脱离了初衷了。

下一期,便是另一“进化神树”--平衡二叉树的闪亮登场,敬请期待!!! 

(也祝各位程序员 1024 快乐!)

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛变涡流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值