书山小站

记录我的程序人生

[算法]二叉查找树🌲

请输入图片描述

#include <iostream>
using namespace std;


typedef struct bitt{
  int date;
  bitt *left;
  bitt *right;
}*Bitree,bitree;

Bitree find_data(Bitree star,int x){
    if (star->date == x){
        return star;
    }else if(star->date < x){
        return find_data(star->right,x);
    }else if(star->date > x){
        return find_data(star->left,x);
    }
    return NULL;
}
/*============Worning Woring SSS================*/
void Delete_tree(Bitree &T,int x){
    // 写轮眼
    Bitree p = T;
    Bitree f = NULL; // 父节点
    Bitree q,s; // q ?
    if(!T) return; // 如果为空就返回
    // 首先找到p
    while (p){
       if(p->date == x)break; // 找到了就退出了
       f = p; // 父节点
       if (p->date > key)
       {
         p = p->left;
       }else{
        p = p->right;
       }
    }

    if(p == NULL) return; // 没找到返回
    // 要删除节点首先就要找到那个节点
    //    - 再判断情况
    //      - 如果他的左树和右树🌲是否为空 
    //         - 为空: 左树为空 把右树直接挂上去 ,右树为空直接把 左树挂上去
    //         - 不为空: 寻找直接前驱 , 如果 左树没有右子树 那么 直接等于左子树, 如果左子树 有右节点 ,直接用找到的s的节点值 等于 s的节点值
    //                - 等于节点值后呢 需要接上节点的q是 s的父亲节点
    //                -  如果s存在 那么 父节点等于他的 左子树
    //                -  如果s不存在 说明 对于节点来说他没有要右子树,也就是说明s是左子树 直接让它的左节点 和父节点指向他相接  
    if((!p->left)&&(!p->right)){ // 如果左右树不为空
      q = p; 
      s = p->left; // s = 左树 
     
      while (s->right){
         q =s;
         s = s->right;
      }

      p->date = s->date;
      /*====================*/
      if(q!=p){
         q->right = s->left;        
      }else{
        q->left = s->left;
      }
      /*====================*/

      delete s;
      
      
    }else{
        // p是找到的原则
      if(!q->left){
         q=p;
         p = p->right;
      }

      if(!q->right){
        q = p;
        p = p->left;
      }
      if(!f){ // 如果在头节
         T = p;
      }else if(q == f->left){
        f->left = p;
      }else{
         f->right = p;
      } 

      delete q;

    }
    
    

}
/*==============================================*/
void Create_tree(Bitree &star,int x){
     if(star == NULL){
        star = new bitree;
        star->date = x;
        cout <<"insert : "  << x << endl;
        star->left= star->right =NULL;
        return;

     }else if(star->date > x){
        Create_tree(star->left,x);
     }else if(star->date <= x){
        Create_tree(star->right,x);
     }
     
}

void for_tree_mid(Bitree star){
    if(star == NULL) return;
    for_tree_mid(star->left);
    cout << star->date << " ";
    for_tree_mid(star->right);
}

int main(){
  int n;  
  cin >> n;
  Bitree x = NULL;
  int tempnum;
  for (int i = 0; i < n; i++){
     cin >> tempnum;
     Create_tree(x,tempnum);
  }
//   cout << x->date;
  for_tree_mid (x);
  
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注