二叉搜索树

这惨绝人寰的日志排版。

 

二叉搜索树:能够高效进行如下操作的数据结构:

1.插入数值。

2.删除数值。

3.查询数值。

满足左小右大。

 

二叉搜索树如果遇到了极端数据情况,会大大降低自己的效率。

平衡二叉树就是二叉搜索树的改进,巧妙地通过旋转操作来保持树的平衡。以下的代码没有实现平衡二叉树的功能,因为C++的STL库里有set容器,set是像前面所说的一样使用二叉搜索树维护集合的容器。

 

二叉搜索树最需要注意的是它的        删除       操作:

1.需要删除的节点没有左儿子,那么就把右儿子提上去。

2.需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。

3。以上两种情况都不满足的话,就把做儿子的子孙中最大的节点提到需要删除的节点上。

 

二叉搜索树最需要注意的是它的        删除       操作:

1.需要删除的节点没有左儿子,那么就把右儿子提上去。

2.需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。

3。以上两种情况都不满足的话,就把做儿子的子孙中最大的节点提到需要删除的节点上。


#include<iostream>
using namespace std;

//二叉搜索树
struct node {
    int val;
    node* lch, * rch;
};


//插入数值x
node* insert(node* p, int x)
{
    if (p == NULL) {
        node* q = new node;
        q->val = x;
        q->lch = q->rch = NULL;
        return q;
    }
    else {
        if (x < p->val)
            p->lch = insert(p->lch, x);
        else p->rch = insert(p->rch, x);
        return p;
    }
}


//查找数值x
bool find(node* p, int x)
{
    if (p == NULL)
        return false;
    else if (x == p->val)
        return true;
    else if (x < p->val)
        return find(p->lch, x);
    else
        return find(p->rch, x);
}


//删除数值x
node * remove(node * p, int x) {
    if (p == NULL)
        return NULL;
    else if (x < p->val)
        p->lch = remove(p->lch, x);
    else if (x > p->val)
        p->rch = remove(p->rch, x);
    else if (p->lch == NULL)
    {
        node* q = p->rch;
        delete p;
        return q;
    }
    else if (p->lch->rch == NULL)
    {
        node* q = p->lch;
        q->rch = p->rch;
        delete p;
        return q;
    }
    else {
        node* q;
        for (q = p->lch; q->rch->rch != NULL; q = q->rch);
        node * r = q->rch;
        q->rch = r->lch;
        r->lch = p->lch;
        r->rch = p->rch;
        delete p;
        return r;
    }
    return p;
}


//先序遍历。
void provisit(node * p) {
    if (p) {
        cout << p->val << " ";
        provisit(p->lch);
        provisit(p->rch);
    }
}


//中序遍历。
void midvisit(node * p) {
    if (p) {
        midvisit(p->lch);
        cout << p->val << " ";
        midvisit(p->rch);
    }
}


//后序遍历:
void nextvisit(node * p) {
    if (p) {
        nextvisit(p->lch);
        nextvisit(p->rch);
        cout << p->val << " ";
    }
}

//测试
int main()
{
    int t = 10, num;
    node* root = nullptr;
    while (t--) {
        cin >> num;
        root = insert(root, num);
    }
    provisit(root);
    cout << endl;
    midvisit(root);
    cout << endl;
    nextvisit(root);
    cout << endl;
    if (find(root, 1)) cout << "find it" << endl;
    else cout << "not find it" << endl;
    if (find(root, 11)) cout << "find it" << endl;
    else cout << "not find it" << endl;
    root = remove(root, 1);
    provisit(root);
    cout << endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值