• 二叉查找树(BST)


    一、简介

            二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:

    • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
    • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
    • 任意节点的左、右子树也分别为二叉查找树;
    • 没有键值相等的节点。

            二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

             二叉查找树是能够高效地进行如下操作的数据结构。

    • 插入一个数值
    • 查询是否包含某个数值
    • 删除某个数值

            二叉查找树满足以下条件:

    • 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
    • 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
    • 任意结点的左、右子树也分别为二叉搜索树。

    二、代码实现

    声明

    1. typedef struct BSTNode{
    2. int data;
    3. BSTNode *lchild,*rchild;
    4. }BSTNode,*BSTree;

    查询

            若二叉查找树为空,则查找失败,返回空指针
            若二叉查找树非空,则将待查找关键字key与根节点的关键字 T − > d a t a T->data T−>data进行比较:
            如果x=T−> data x=T->data x=T−>data,则查找成功,返回查询到的当前节点T
            如果x data xdata xdata,则递归查找左子树
            如果x>T−> data x>T->data x>T−>data,则递归查找右子树

    1. BSTree find(BSTree T,int key)
    2. {
    3. if(!T||T->data==key)
    4. {
    5. return T;
    6. }
    7. else if(keydata)
    8. {
    9. return find(T->lchild,key);
    10. }
    11. else
    12. {
    13. return find(T->rchild,key);
    14. }
    15. }

    插入

    1. void insert(BSTree &T,int e)
    2. {
    3. if(!T)
    4. {
    5. BSTree S=new BSTNode;
    6. S->data=e;
    7. S->lchild=S->rchild=NULL;
    8. T=S;
    9. }
    10. else if(edata)
    11. {
    12. insert(T->lchild,e);
    13. }
    14. else if(e>T->data)
    15. {
    16. insert(T->rchild,e);
    17. }
    18. }

    创建

            二叉查找树的创建可以从空树开始,按照输入关键字的顺序依次进行插入操作,最终得到一棵二叉查找树。 

    1. void build(BSTree &T)
    2. {
    3. T=NULL;
    4. int e;
    5. while(cin>>e,e!=-1)
    6. {
    7. insert(T,e);
    8. }
    9. }

    删除

    1. void del(BSTree &T,int key)
    2. {
    3. BSTree p=T;
    4. BSTree f=NULL;
    5. BSTree q,s;
    6. if(!T)
    7. {
    8. return;
    9. }
    10. while(p)
    11. {
    12. if(p->data==key)
    13. {
    14. break;
    15. }
    16. f=p;
    17. if (p->data>key)
    18. {
    19. p=p->lchild;
    20. }
    21. else
    22. {
    23. p=p->rchild;
    24. }
    25. }
    26. if(!p)
    27. {
    28. return;
    29. }
    30. if((p->lchild)&&(p->rchild))
    31. {
    32. q=p;
    33. s=p->lchild;
    34. while(s->rchild)
    35. {
    36. q=s;
    37. s=s->rchild;
    38. }
    39. p->data=s->data;
    40. if(q!=p)
    41. {
    42. q->rchild=s->lchild;
    43. }
    44. else
    45. {
    46. q->lchild=s->lchild;
    47. }
    48. delete s;
    49. }
    50. else
    51. {
    52. if(!p->rchild)
    53. {
    54. q=p;
    55. p=p->lchild;
    56. }
    57. else if(!p->lchild)
    58. {
    59. q=p;
    60. p=p->rchild;
    61. }
    62. if(!f)
    63. {
    64. T=p;
    65. }
    66. else if(q==f->lchild)
    67. {
    68. f->lchild=p;
    69. }
    70. else
    71. {
    72. f->rchild=p;
    73. }
    74. delete q;
    75. }
    76. }

    以上就是本文的全部内容啦!感谢阅读!

  • 相关阅读:
    c语言进制的转换8进制转换2进制与2转8
    10_springAOP基础_JDK动态代理
    Java_位运算符简述
    打出「智驾之王」,小鹏1024科技日为什么这么敢?
    搞数据库是不是越老越吃香?
    BATCH/批处理命令
    shell入门第6课 环境变量
    Windows上配置IP端口转发
    【JavaScript】blob
    【软考】8.1 程序语言基本概念-成分-函数
  • 原文地址:https://blog.csdn.net/weixin_46522531/article/details/126677213