zoukankan      html  css  js  c++  java
  • 查找二:二叉排序树查找

      1 //二叉排序树
      2 #include<iostream>
      3 using namespace std;
      4 
      5 typedef struct BiTNode
      6 {
      7     int data;  //结点数据
      8     BiTNode *lchild, *rchild; //左右孩子指针
      9 }*BiTree;
     10 
     11 //递归查找二叉排序树T中是否存在key
     12 //指针f指向T的双亲,初始值为NULL
     13 //若查找成功,指针p指向该数据元素结点并返回true
     14 //否则指针p指向查找路径上访问的最后一个结点并返回false
     15 bool SearchBT(BiTree T, int key, BiTree f, BiTree *p)
     16 {
     17     if(!T)
     18     {
     19         *p = f;
     20         return false;
     21     }
     22 
     23     if(key==T->data)
     24     {
     25         *p = T;
     26         return true;
     27     }
     28     else if(key<T->data)
     29     {
     30         return SearchBT(T->lchild, key, T, p);
     31     }
     32     else
     33     {
     34         return SearchBT(T->rchild, key, T, p);
     35     }
     36 }
     37 
     38 //当二叉排序树T中不存在关键字等于key的数据元素时
     39 //插入key并返回true,否则返回false
     40 bool InsertBST(BiTree *T, int key)
     41 {
     42     BiTree p, s;
     43     if(SearchBT(*T,key,NULL,&p))
     44         return false;
     45     else
     46     {
     47         s = new BiTNode;
     48         s->data = key;
     49         s->lchild = s->rchild = NULL;
     50         if(!p)
     51             *T = s;  //插入s为新的根结点
     52         else if(key<p->data)
     53             p->lchild = s; //插入s为左孩子
     54         else
     55             p->rchild = s; //插入为s的右孩子
     56         return true;
     57     }
     58 }
     59 
     60 //从二叉排序树中删除结点p,并重接它的左右子树
     61 bool Delete(BiTree *p)
     62 {
     63     BiTree q, s;
     64     if((*p)->rchild==NULL) //若右子树为空
     65     {
     66         q = *p;
     67         *p = (*p)->lchild;
     68         delete q;
     69     }
     70     else if((*p)->lchild==NULL) //若左子树为空
     71     {
     72         q = *p;
     73         *p = (*p)->rchild;
     74         delete q;
     75     }
     76     else //左右子树均不为空
     77     {
     78         q = *p;
     79         s = (*p)->lchild;
     80         while(s->rchild)
     81         {
     82             q = s;
     83             s = s->rchild;
     84         }
     85         (*p)->data = s->data;
     86         if(q!=*p)
     87             q->rchild = s->lchild;
     88         else
     89             q->lchild = s->lchild;
     90         delete s;
     91     }
     92     return true;
     93 }
     94 
     95 //若二叉排序树T存在关键字等于key的数据元素时,删除该结点
     96 bool DeleteBST(BiTree *T, int key)
     97 {
     98     if(!*T)
     99         return false;
    100     else
    101     {
    102         if(key==(*T)->data)
    103             return Delete(T);
    104         else if(key<(*T)->data)
    105             return DeleteBST(&(*T)->lchild, key);
    106         else
    107             return DeleteBST(&(*T)->rchild,key);
    108     }
    109 }
    110 
    111 void PreOrderPrint(BiTree T)
    112 {
    113     if(T==NULL)
    114         return; 
    115     cout<<T->data<<" ";
    116     PreOrderPrint(T->lchild);
    117     PreOrderPrint(T->rchild);
    118 }
    119 
    120 int main()
    121 {
    122     int a[10] = {62,88,58,47,35,73,51,99,37,93};
    123     BiTree T = NULL;
    124 
    125     for(int i=0;i<10;i++)
    126         InsertBST(&T,a[i]);
    127     PreOrderPrint(T);
    128     cout<<endl;
    129     DeleteBST(&T,93);
    130     PreOrderPrint(T);
    131     cout<<endl;
    132     DeleteBST(&T,47);
    133     PreOrderPrint(T);
    134     cout<<endl;
    135     
    136     system("pause");
    137     return 0;
    138 }
  • 相关阅读:
    如何设计一个百万级用户的抽奖系统?
    服务注册发现
    消息列队7
    消息列队6
    bzoj 4771: 七彩树
    [SDOI2013]刺客信条
    bzoj 5291: [Bjoi2018]链上二次求和
    51nod 1245 Binomial Coefficients Revenge
    bzoj 5308: [Zjoi2018]胖
    bzoj 5294: [Bjoi2018]二进制
  • 原文地址:https://www.cnblogs.com/jx-yangbo/p/5956678.html
Copyright © 2011-2022 走看看