当前位置:   article > 正文

4张GIF图帮助你理解二叉查找树算法_查找算法gif

查找算法gif

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

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

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

下面 4 张 GIF 动图,是 penjee 官博制作分享。,分享给大家。

图1:查找 BST 中的某个元素

在二叉搜索树b中查找x的过程为:

  1. 若b是空树,则搜索失败,否则:
  2. 若x等于b的根节点的数据域之值,则查找成功;否则:
  3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:
  4. 查找右子树。

图2 ↓ :从有序数组构造一个二叉查找树

图3 ↓:往 BST 中插入元素

向一个二叉搜索树b中插入一个节点s的算法,过程为:

  1. 若b是空树,则将s所指结点作为根节点插入,否则:
  2. 若s->data等于b的根节点的数据域之值,则返回,否则:
  3. 若s->data小于b的根节点的数据域之值,则把s所指节点插入到左子树中,否则:
  4. 把s所指节点插入到右子树中。(新插入节点总是叶子节点)

图4 ↓:BST 转成有序数组

  1. #include <iostream>  
  2. using namespace std;  
  3. //二叉树二叉链表结点结构定义  
  4. typedef struct BiTNode   
  5. {  
  6.     int data;  
  7.     struct BiTNode *lchild ,*rchild;  
  8. }BiTNode,*BiTree;  
  9. /************************************************************************/  
  10. /* 递归查找二叉排序树T中是否存在key                                     */  
  11. /* 指针f指向T的双亲,其初始调用值为NULL                                 */  
  12. /* 若查找成功,则指针p指向该数据元素结点,并返回TRUE                    */  
  13. /* 否则指针p指向查找路径上访问的最后一个结点并返回FALSE                 */             
  14. /************************************************************************/  
  15. bool searchBST(BiTree &T,int key,BiTree f,BiTree &p)  
  16. {  
  17.     if (!T)  //查找不成功 指针p指向查找路径上访问的最后一个结点并返回FALSE
  18.     {  
  19.         p = f;  
  20.         return false;  
  21.     }  
  22.     else if (key == T->data)//查找成功   
  23.     {  
  24.         p = T;//若查找成功,则指针p指向该数据元素结点  
  25.         return true;  
  26.     }  
  27.     else if (key < T->data)  
  28.     {  
  29.         return searchBST(T->lchild,key,T,p);  
  30.     }  
  31.     else  
  32.     {  
  33.         return searchBST(T->rchild,key,T,p);  
  34.     }  
  35. }  
  36. /************************************************************************/  
  37. /* 当二叉排序树T中不存在关键字等于key的数据元素时,                     */  
  38. /*  插入key并返回TRUE,否则返回FALSE                                    */  
  39. /************************************************************************/  
  40. bool insertBST(BiTree &T,int key)  
  41. {  
  42.     BiTree p=NULL,s;  
  43.     if (!searchBST(T,key,NULL,p))//查找不成功  
  44.     {  
  45.         s = (BiTree)malloc(sizeof(BiTNode));  
  46.         s->data = key;  
  47.         s->lchild = s->rchild = NULL;  
  48.         if (!p)  //插入的一个元素
  49.         {  
  50.             T = s;  
  51.         }  
  52.         else if (key<p->data)  
  53.         {  
  54.             p->lchild = s;  
  55.         }  
  56.         else  
  57.         {  
  58.             p->rchild = s;  
  59.         }  
  60.         return true;  
  61.     }  
  62.     else  
  63.     {  
  64.         return false;//数中已有关键字相同的结点 不再插入  
  65.     }  
  66. }  
  67. //创建二叉排序树BST  
  68. bool createBST(BiTree &T,int*a, int n)  
  69. {  
  70.     T = NULL;  
  71.     bool s=NULL ;  
  72.     for (int i = 0;i<n;i++)  
  73.     {  
  74.         s = insertBST(T,a[i]);  
  75.         if (!s)
  76.         {
  77.             cout<<"insert err"<<endl;
  78.             break;
  79.         }
  80.     }  
  81.     return s;  
  82. }  
  83. // 中序遍历      
  84. void inOrderBST(BiTree T)      
  85. {      
  86.     if(T)      
  87.     {      
  88.         inOrderBST(T->lchild);      
  89.         cout << T->data << " ";      
  90.         inOrderBST(T->rchild);      
  91.     }      
  92. }   
  93. //后续遍历销毁二叉树      
  94. void freeTree(BiTNode* root)      
  95. {      
  96.     if (root!=NULL)      
  97.     {      
  98.         if (root->lchild)      
  99.         {      
  100.             freeTree(root->lchild);      
  101.             root->lchild = NULL;      
  102.         }      
  103.         if (root->rchild)      
  104.         {      
  105.             freeTree(root->rchild);      
  106.             root->rchild = NULL;      
  107.         }      
  108.         if (root!=NULL)      
  109.         {      
  110.             free(root);      
  111.             root=NULL;      
  112.         }      
  113.     }      
  114. }      
  115. int main()  
  116. {  
  117.     int a[14] = {19, 32, 28, 14, 37, 18, 5, 21, 23, 25,12,30,11,15};      
  118.     int n = 14;      
  119.     BiTree T,f=NULL,p=NULL;     
  120.     bool result=false;  
  121.     // 并非所有的a[]都能构造出BITree,所以,最好对createBITree的返回值进行判断      
  122.     result = createBST(T, a, n);  
  123.     if (!result)  
  124.     {  
  125.         cout<<"createBST error"<<endl;  
  126.         system("pause");
  127.         return -1;  
  128.     }  
  129.     inOrderBST(T);      
  130.     cout << endl;      
  131.     searchBST(T,3,f,p);
  132.     cout<<p->data<<endl;
  133.     freeTree(T);    
  134.     system("pause");  
  135.     return 0;  
  136. }  



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/783370
推荐阅读
相关标签
  

闽ICP备14008679号