MENU

二叉查找树

December 26, 2020 • 算法

二叉查找树的查找遍历插入删除

/*
 * @Author: Mr.Sen
 * @LastEditTime: 2020-12-26 15:55:44
 * @Description: 二叉树查找
 * @Website: https://grimoire.cn
 * @Copyright (c) Mr.Sen All rights reserved.
 */
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
const int M = 1e9 + 10;

typedef struct node
{
    int data;
    node *l, *r;
} node, *tNode;

tNode search(tNode cur, int key)
{
    if (cur == NULL || cur->data == key)
        return cur;
    else if (cur->data > key)
        return search(cur->l, key);
    else
        return search(cur->r, key);
}

void insert(tNode &cur, int key)
{
    if (cur == NULL)
    {
        tNode s = new node;
        s->data = key;
        s->l = NULL;
        s->r = NULL;
        cur = s;
    }
    else if (cur->data > key)
        insert(cur->l, key);
    else
        insert(cur->r, key);
}

bool deleteNode(tNode &s, int key)
{
    tNode p = s;
    tNode f = NULL;
    while (p->data != key && p != NULL)
    {
        f = p;
        if (p->data < key)
            p = p->r;
        else
            p = p->l;
    }
    if (p == NULL)
        return false;

    if (p->l == NULL && p->r == NULL)
    {
        // * 叶子节点
        cout << "CUR:" << p->data << endl;
        if (f->l == p)
        {
            f->l = NULL;
            delete p;
        }
        else
        {
            f->r = NULL;
            delete p;
        }
        return true;
    }

    if (p->l != NULL && p->r != NULL)
    {
        // * 有两个子节点
        tNode minP = p->r;
        tNode minF = p;
        while (minP->l)
        {
            minF = minP;
            minP = minP->l;
        }
        if (minF == p)
        {
            p->data = p->l->data;
            delete p->l;
            p->l = NULL;
        }
        else
        {
            p->data = minP->data;
            minF->l = NULL;
            delete minP;
        }

        return true;
    }

    if (p->l != NULL || p->r != NULL)
    {
        // * 只有一个子节点
        if (f->l == p)
        {
            if (p->l)
                f->l = p->l;
            else
                f->l = p->r;
        }
        else
        {
            if (p->l)
                f->r = p->l;
            else
                f->r = p->r;
        }
        cout << "!!:" << endl;
        return true;
    }
}

void forEach(tNode s)
{
    if (s != NULL)
    {
        cout << s->data << " ";
        forEach(s->l);

        forEach(s->r);
    }
}
int main()
{
    // freopen("1.in", "r", stdin);
    // freopen("output.out","w", stdout);
    tNode head = NULL;
    int x;
    while (cin >> x && x != 0)
    {
        insert(head, x);
    }
    forEach(head);
    cout << endl;

    cout << deleteNode(head, 6) << endl;
    search(head, 6) == NULL ? cout << "deleted!" << endl : cout << "Exist!" << endl;
    forEach(head);
    cout << endl;
    return 0;
}

/*
* sample input:
1 2 6 3 8 5 7 9 0
*/
作者:NorthCity1984
出处:https://grimoire.cn/algorithm/bst.html
版权:本文《二叉查找树》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任