数据结构 查找 上机实验代码 上海大学

验收过的代码,放心食用。实现方法不是最优,因为懒得改。大佬轻喷。

文章目录

BST

#ifndef BST_H
#define BST_H

#include <bits/stdc++.h>
using namespace std;

class BSTnode{
public:
    int data;
    BSTnode *ls,*rs;
    BSTnode(){}
    BSTnode(int ndata,BSTnode *l=nullptr,BSTnode *r=nullptr):data(ndata),ls(l),rs(r){}
};

class BSCTnode{
public:
    int data,cnt;
    BSCTnode *ls,*rs;
    BSCTnode(){}
    BSCTnode(int ndata,BSCTnode *l=nullptr,BSCTnode *r=nullptr):data(ndata),cnt(1),ls(l),rs(r){}
};

class BST{
public:
    BST():root(nullptr){}
    virtual ~BST();
    void traverse();
    bool find(int elem);
    bool insert(int elem);
    bool del(int elem);
    void findelems(int elem);
private:
    void __del(BSTnode* cur,BSTnode* prev);
    void TraverseMid(BSTnode* now);
    void clear(BSTnode* now);
    void __findelems(int elem,BSTnode* now);
    BSTnode* FindCurrent(int elem,BSTnode* now);
    BSTnode* FindPrev(int elem,BSTnode* now,BSTnode* prev=nullptr);
    BSTnode *root;
};

class BSCT{
public:
    BSCT():root(nullptr){}
    int find(int elem);
    void traverse();
private:
    void __traverse(BSCTnode* now);
    BSCTnode* root;
};

class BIT{
public:
    BIT():root(nullptr){}
    BSTnode* CreatByPrev(vector<int> prev,vector<int> mid,int prel,int prer,int midl,int midr);
    bool isBST();
    void traverse();
private:
    void TraverseByMid(BSTnode* now);
    void __isBST(BSTnode* now,vector<int>& v);
    BSTnode* root;
};

void BST::findelems(int elem){
    __findelems(elem,root);
    cout<<endl;
}

void BSCT::traverse(){
    if(root==nullptr){
        cout<<"empty tree!"<<endl;
        return ;
    }
    __traverse(root);
    cout<<endl;
}

void BSCT::__traverse(BSCTnode* now){
    if(now->ls!=nullptr) __traverse(now->ls);
    cout<<now->data<<"("<<now->cnt<<") ";
    if(now->rs!=nullptr) __traverse(now->rs);
}

int BSCT::find(int elem){
    if(root==nullptr) {
        root = new BSCTnode(elem);
        return 0;
    }
    BSCTnode *now=root,*pre=nullptr;
    while(now){
        if(now->data==elem)
            return ++now->cnt;
        else if(now->data>elem)
            pre = now , now = now->ls;
        else
            pre = now , now = now->rs;
    }
    if(pre->data>elem)
        pre->ls = new BSCTnode(elem);
    else
        pre->rs = new BSCTnode(elem);
    return 0;
}

void BST::__findelems(int elem,BSTnode* now){
    if(now==nullptr) return ;
    if(now->data>elem){
        __findelems(elem,now->rs);
        cout<<now->data<<" ";
        __findelems(elem,now->ls);
    }
    else if(now->data<elem){
        __findelems(elem,now->rs);
    }
    else{
        __findelems(elem,now->rs);
        cout<<now->data<<" ";
    }
}

bool BIT::isBST(){
    if(root==nullptr) return true;
    vector<int> v;
    v.clear();
    __isBST(root,v);
    for(int i=1;i<v.size();i++){
        if(v[i-1]>=v[i]) return false;
    }
    return true;
}

void BIT::__isBST(BSTnode* now,vector<int>& v){
    if(now->ls) __isBST(now->ls,v);
    v.push_back(now->data);
    if(now->rs) __isBST(now->rs,v);
}

void BIT::TraverseByMid(BSTnode* now){
    if(now->ls!=nullptr) TraverseByMid(now->ls);
    cout<<now->data<<" ";
    if(now->rs!=nullptr) TraverseByMid(now->rs);
}

void BIT::traverse(){
    if(root==nullptr) return ;
    TraverseByMid(root);
    cout<<endl;
}

BSTnode* BIT::CreatByPrev(vector<int> prev,vector<int> mid,int prel,int prer,int midl,int midr){
    if(midl>midr) return nullptr;
    BSTnode* now = new BSTnode(prev[prel]);
    int index;
    if(root==nullptr) root = now;
    for(index=midl;index<=midr;index++)
        if(prev[prel]==mid[index])
            break;
    now->ls = CreatByPrev(prev,mid,prel+1,prel+index-midl,midl,index-1);
    now->rs = CreatByPrev(prev,mid,prel+index-midl+1,prer,index+1,midr);
    return now;
}

void BST::__del(BSTnode* cur,BSTnode* prev){
    if(cur->ls==nullptr&&cur->rs==nullptr&&prev!=nullptr){  //叶子节点
        if(prev->ls==cur) prev->ls=nullptr;
        else prev->rs=nullptr;
        delete cur;
        return ;
    }
    if(cur->ls==nullptr&&cur->rs==nullptr&&prev==nullptr){  //特判根节点
        delete root;
        root=nullptr;
        return ;
    }
    if(cur->ls!=nullptr){   //找直接前驱
        BSTnode *p=cur->ls , *pp = cur;
        while(p->rs!=nullptr)
            pp = p , p = p->rs;
        cur->data = p->data;
        __del(p,pp);
    }
    else{                   //不存在直接前驱时,找直接后驱
        BSTnode *p=cur->rs , *pp = cur;
        while(p->ls!=nullptr)
            pp = p , p = p->ls;
        cur->data = p->data;
        __del(p,pp);
    }
}

bool BST::del(int elem){
    /*
        parameter:删除元素的值
        先找到父节点 (注意特判根节点)
        调用工具函数 __del删除结点

        __del函数:
        判断当前节点是否是叶子节点,如果是则直接删掉
        注意特判根节点

        如果不是根节点,则找直接前驱或直接后继替代该节点的位置
        然后递归删除该直接前驱或后继

        return:是否删除成功
    */
    if(root==nullptr) return false;
    BSTnode *prev = FindPrev(elem,root) , *cur=nullptr;
    if(root->data==elem){
        __del(root,nullptr);
        return true;
    }
    if(prev->ls!=nullptr&&prev->ls->data==elem){
        cur = prev->ls;
        __del(cur,prev);
        return true;
    }
    if(prev->rs!=nullptr&&prev->rs->data==elem){
        cur = prev->rs;
        __del(cur,prev);
        return true;
    }
    return false;
}

void BST::TraverseMid(BSTnode* now){
    if(now->ls) TraverseMid(now->ls);
    cout<<now->data<<" ";
    if(now->rs) TraverseMid(now->rs);
}

void BST::traverse(){
    if(root==nullptr) return ;
    TraverseMid(root);
    cout<<endl;
}

BST::~BST(){
    if(root==nullptr) return ;
    clear(root);
}

void BST::clear(BSTnode* now){
    if(now->ls!=nullptr) clear(now->ls);
    if(now->rs!=nullptr) clear(now->rs);
    delete now;
}

BSTnode* BST::FindPrev(int elem,BSTnode* now,BSTnode* prev){
    if(now==nullptr||now->data==elem) return prev;
    if(now->data>elem) return FindPrev(elem,now->ls,now);
    else return FindPrev(elem,now->rs,now);
}

bool BST::insert(int elem){
    if(root==nullptr){
        root = new BSTnode(elem);
        return true;
    }
    BSTnode* prev = FindPrev(elem,root);
    if(prev==nullptr&&root->data==elem){            //elem is root
        return false;
    }
    else if(prev->data>elem&&prev->ls==nullptr){    //elem exist
        prev->ls = new BSTnode(elem);
        return true;
    }
    else if(prev->data>elem&&prev->ls->data==elem){ //elem does not exist
        return false;
    }
    else if(prev->data<elem&&prev->rs==nullptr){
        prev->rs = new BSTnode(elem);
        return true;
    }
    else{
        return false;
    }
}

bool BST::find(int elem){
    return FindCurrent(elem,root)!=nullptr;
}

BSTnode* BST::FindCurrent(int elem,BSTnode* now){
    if(now==nullptr) return nullptr;
    if(now->data==elem) return now;
    if(now->data>elem) return FindCurrent(elem,now->ls);
    else return FindCurrent(elem,now->rs);
}

#endif /* BST_H */

AVL

#ifndef AVL_H
#define AVL_H

#include <bits/stdc++.h>
using namespace std;

class node{
public:
    int data,h,lsize,size;
    node *ls,*rs;
    node(){}
    node(int nelem,node* l=nullptr,node* r=nullptr):data(nelem),size(1),lsize(1),h(1),ls(nullptr),rs(nullptr){}
};

class AVL{
public:
    AVL():root(nullptr){}
    AVL(vector<int> &v);
    void traverse();
    void insert(int elem);
    bool find(int elem);
    void del(int elem);
    void findelems(int elem);
    int kth(int x);
private:
    int __kth(int x,node* rt);
    void __findelems(int elem,node* rt);
    node* __del(int elem,node* rt);
    node* __insert(int elem,node* rt);
    bool __find(int elem,node* rt);
    int get_balance(node* rt) {return rt==nullptr?0:get_h(rt->ls)-get_h(rt->rs);}
    int get_h(node *rt) {return rt==nullptr?0:rt->h;}
    int get_lsize(node *rt) {return rt==nullptr?0:rt->lsize;};
    int get_size(node *rt) {return rt==nullptr?0:rt->size;};
    void pushup(node *rt);
    void __traverse(node* now);
    node* ll_rotate(node *rt);
    node* rr_rotate(node *rt);
    node* lr_rotate(node *rt);
    node* rl_rotate(node *rt);
    node* root;
};

int AVL::kth(int x){
    if(root==nullptr) {
        cout<<"empty tree!"<<endl;
        return -1;
    }
    if(x<0||x>root->size){
        cout<<"illegal input"<<endl;
        return -1;
    }
    return __kth(x,root);
}

int AVL::__kth(int x,node* rt){
    if(rt->lsize==x) return rt->data;
    else if(rt->lsize>x) return __kth(x,rt->ls);
    else return __kth(x-rt->lsize,rt->rs);
}

void AVL::pushup(node *rt){
    rt->h = max(get_h(rt->ls),get_h(rt->rs))+1;
    rt->size = get_size(rt->ls)+get_size(rt->rs)+1;
    rt->lsize = get_size(rt->ls)+1;
}

void AVL::findelems(int elem){
    if(root==nullptr) {
        cout<<"empty tree!"<<endl;
        return ;
    }
    __findelems(elem,root);
}

void AVL::__findelems(int elem,node* rt){
    if(rt==nullptr) return ;
    if(rt->data>elem){
        __findelems(elem,rt->ls);
        cout<<rt->data<<" ";
        __findelems(elem,rt->rs);
    }
    if(rt->data<=elem){
        __findelems(elem,rt->rs);
    }
}

AVL::AVL(vector<int> &v){
    root=nullptr;
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        insert(*it);
}

void AVL::del(int elem){
    if(root==nullptr) return ;
    root = __del(elem,root);
}

node* AVL::__del(int elem,node* rt){
    if(rt==nullptr) return nullptr;
    if(rt->data>elem) rt->ls = __del(elem,rt->ls);
    else if(rt->data<elem) rt->rs = __del(elem,rt->rs);
    else {
        if(rt->ls!=nullptr){
            node* p=rt->ls;
            while(p->rs)
                p = p->rs;
            rt->data = p->data;
            rt->ls = __del(rt->data,rt->ls);
        }else if(rt->ls==nullptr && rt->rs!=nullptr){
            node* p=rt->rs;
            while(p->ls)
                p = p->ls;
            rt->data = p->data;
            rt->rs = __del(rt->data,rt->rs);
        }else{
            delete rt;
            return nullptr;
        }
    }
    pushup(rt);
    int delta = get_balance(rt);
    int delta_ls = get_balance(rt->ls);
    int delta_rs = get_balance(rt->rs);
    if(delta>1 && delta_ls>0)
        return ll_rotate(rt);
    if(delta>1 && delta_ls<0)
        return lr_rotate(rt);
    if(delta<-1 && delta_rs>0)
        return rl_rotate(rt);
    if(delta<-1 && delta_rs<0)
        return rr_rotate(rt);
    return rt;
}

bool AVL::find(int elem){
    if(root==nullptr) return false;
    return __find(elem,root);
}

bool AVL::__find(int elem,node* rt){
    if(rt==nullptr) return false;
    if(rt->data==elem) return true;
    if(rt->data>elem) return __find(elem,rt->ls);
    if(rt->data<elem) return __find(elem,rt->rs);
    return false;
}

void AVL::insert(int elem){
    if(root==nullptr){
        root = new node(elem);
        return ;
    }
    root = __insert(elem,root);
}

node* AVL::__insert(int elem,node* rt){
    if(rt==nullptr)
        return new node(elem);
    if(rt->data>elem) 
        rt->ls = __insert(elem,rt->ls);
    else if(rt->data<elem) 
        rt->rs = __insert(elem,rt->rs);
    else 
        return new node(elem);
    pushup(rt);
    int delta = get_balance(rt);
    int delta_ls = get_balance(rt->ls);
    int delta_rs = get_balance(rt->rs);
    if(delta>1 && delta_ls>0)
        return ll_rotate(rt);
    if(delta>1 && delta_rs<0)
        return lr_rotate(rt);
    if(delta<-1 && delta_rs>0)
        return rl_rotate(rt);
    if(delta<-1 && delta_rs<0)
        return rr_rotate(rt);
    return rt;
}

node* AVL::lr_rotate(node *rt){
    rt->ls = rr_rotate(rt->ls);
    return ll_rotate(rt->rs);
}

node* AVL::rl_rotate(node *rt){
    rt->rs = ll_rotate(rt->rs);
    return rr_rotate(rt);
}

node* AVL::rr_rotate(node *rt){
    node *tmp = rt->rs;
    rt->rs = tmp->ls;
    tmp->ls = rt;
    pushup(rt);
    pushup(tmp);
    return tmp;
}

node* AVL::ll_rotate(node *rt){
    node *tmp = rt->ls;
    rt->ls = tmp->rs;
    tmp->rs = rt;
    pushup(rt);
    pushup(tmp);
    return tmp;
}

void AVL::traverse(){
    if(root==nullptr){
        cout<<"empty tree!"<<endl;
        return ;
    }
    __traverse(root);
    cout<<endl;
}

void AVL::__traverse(node *now){
    if(now->ls!=nullptr) __traverse(now->ls);
    cout<<now->data<<" ";
    if(now->rs!=nullptr) __traverse(now->rs);
}

#endif /* AVL_H */

主函数

#include <bits/stdc++.h>
#include "BST.h"
#include "AVL.h"
using namespace std;

void test01(){
    /*binary search lower_bound*/
    int a[12] = {1,1,2,2,3,3,4,4,5,5,7,7};
    cout<<my_lower_bound(a,12,5)<<endl;
}

void test02(){
    /*BST*/
    // 8
    BST tree;
    int m,x;
    cin>>m;
    for(int i=0;i<m;i++){
        int data;
        cin>>data;
        tree.insert(data);
        tree.traverse();
    }
    cout<<"findelems: "<<endl;
    cin>>x;
    tree.findelems(x);
    cout<<"del: "<<endl;
    for(int i=0;i<m;i++){
        int data;
        cin>>data;
        tree.del(data);
        tree.traverse();
    }
}

void test03(){
    /*is BST*/
    // 7
    vector<int> pre = {5,3,1,4,7,9,6};
    vector<int> mid = {1,3,4,5,9,7,6};
    BIT tree;
    tree.CreatByPrev(pre,mid,0,pre.size()-1,0,mid.size()-1);
    cout<<tree.isBST()<<endl;
    tree.traverse();
}

/*
vector<int> pre = {5,3,1,4,7,6,9};
vector<int> mid = {1,3,4,5,6,7,9};
*/

void test04(){
    // 10
    BSCT tree;
    int m;
    cin>>m;
    while(m--){
        int elem;
        cin>>elem;
        cout<<"result query: "<<tree.find(elem)<<endl<<"total elem: ";
        tree.traverse();
    }
}

void test05(){
    // 9
    vector<int> v={10,5,1,7,15,12,20};
    AVL tree(v);
    tree.traverse();
    for(int i=1;i<=8;i++)
        cout<<tree.kth(i)<<endl;
    //tree.findelems(10);
}

int main(){
    test04();
    //system("PAUSE");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值