二叉搜索树Ⅲ【东北大学oj数据结构8-3】C++

二叉搜索树 III

B:在二叉搜索树II中加入delete指令,创建程序对二叉搜索树T执行如下指令。

插入 k:将key k 插入到 T 中。

find k:报告T中是否存在key k。

delete k:删除key为 k 的节点。

打印:使用中序树遍历和先序树遍历算法打印key值。

删除 k,删除二叉搜索树 T 给定的键为 k 的节点 z,更新父子链接(指针),同时根据考虑以下三种情况的算法保持二叉搜索树条件:

如果 z 没有孩子,则删除 z 的父母 p 的孩子(即 z)。

如果 z 只有一个孩子,将 z 的父节点的子节点更改为 z 的子节点,将 z 的子节点的父节点更改为 z 的父节点,然后从树中删除 z。

如果 z 有两个孩子,则将 z 的下一个节点 y 的key复制到 z 的key并删除 y。这里z的下一个节点是中间前向巡逻中z之后得到的节点。

输入

输入的第一行给出了指令数 m。在下一个 m 行,以插入 k、查找 k、删除 k 或打印的形式在一行上给出指令。

输出

对于每个 find k 指令,如果 T 包含 k 则输出 yes,如果 T 不包含则输出 no。

进一步,对于每条打印指令,将中序遍历算法和先序遍历算法得到的key的排列输出到一行。在每个key之前打印一个空格。

约束

指令数不超过50万条。

打印指令数量不超过10条。

−2,000,000,000 ≤ key ≤ 2,000,000,000

如果按照上面的伪代码算法,树的高度不会超过100。

二叉搜索树中的键没有重复。

数据结构

18

insert 8

insert 2

insert 3

insert 7

insert 22

insert 1

find 1

find 2

find 3

find 4

find 5

find 6

find 7

find 8

print

delete 3

delete 7

print

输出样例

yes

yes

yes

no

no

no

yes

yes

1 2 3 7 8 22

8 2 1 3 7 22

1 2 8 22

8 2 1 22

cpp 复制代码
#include <iostream>
#include <stack>
#include <vector>
#include <string>
using namespace std;
 
// 定义树的节点结构
struct Node {
    int key;
    Node* right;
    Node* left;
    Node* p;
};
 
Node* creat(int a)
{
    Node* n=new Node();
    n->key=a;
    n->left=nullptr;
    n->right=nullptr;
    n->p=nullptr;
    return n;
}
 
Node* insertt(Node* root,Node* z)
{
    Node* y=nullptr;
    Node* x=root;
    while(x!=nullptr)
    {
        y=x;
        if(z->key<x->key)
            x=x->left;
        else
            x=x->right;
    }
    z->p=y;
    if(y==nullptr)
        root=z;
    else if(z->key<y->key)
        y->left=z;
    else
        y->right=z;
 
    return root;
}
 
Node* findd(Node* root,int k)
{
    while(root!=nullptr&&k!=root->key)
    {
        if(k<root->key)
            root=root->left;
        else
            root=root->right;
    }
    return root;
}
 
Node* deletee(Node* root,Node* z)
{
    if(z->left==nullptr&&z->right==nullptr)
    {
        if(z->p==nullptr)
        {
            delete z;
            return nullptr;
        }
        if(z->p->left==z)
            z->p->left=nullptr;
        else
            z->p->right=nullptr;
        delete z;
    }
    else if(z->left==nullptr||z->right==nullptr)
    {
        Node* child=(z->left!=nullptr)?z->left:z->right;
        if(z->p==nullptr)
        {
            delete z;
            return child;
        }
        if(z->p->left==z)
            z->p->left=child;
        else
            z->p->right=child;
        child->p=z->p;
        delete z;
    }
    else
    {
        Node* y=z->right;
        while(y->left!=nullptr)
        {
            y=y->left;
        }
        z->key=y->key;
        root=deletee(root,y);
    }
    return root;
}
 
void preorder(Node* a)
{
    if(a==nullptr) return;
    cout<<a->key<<" ";
    preorder(a->left);
    preorder(a->right);
}
void inorder(Node* a)
{
    if(a==nullptr) return;
    inorder(a->left);
    cout<<a->key<<" ";
    inorder(a->right);
}
 
int main() {
    int n;
    Node* tree=nullptr;
    cin>>n;
    for (int i = 0; i < n; i++) {
        string c;
        cin>>c;
        if(c=="insert")
        {
            int v;
            cin>>v;
            Node* newNode=creat(v);
            tree=insertt(tree,newNode);
        }
        if(c=="find")
        {
            int v;
            cin>>v;
            Node* a=findd(tree,v);
            if(a)
                cout<<"yes"<<endl;
            else
                cout<<"no"<<endl;
        }
        if(c=="delete")
        {
            int v;
            cin>>v;
            Node* a=findd(tree,v);
            if(a)
                tree=deletee(tree,a);
        }
        if(c=="print")
        {
            inorder(tree);
            cout<<endl;
            preorder(tree);
            cout<<endl;
        }
    }
    return 0;
}
相关推荐
Victoria.a8 分钟前
顺序表和链表(详解)
数据结构·链表
old_power14 分钟前
【PCL】Segmentation 模块—— 基于图割算法的点云分割(Min-Cut Based Segmentation)
c++·算法·计算机视觉·3d
Bran_Liu28 分钟前
【LeetCode 刷题】字符串-字符串匹配(KMP)
python·算法·leetcode
涛ing31 分钟前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
Jcqsunny1 小时前
[分治] FBI树
算法·深度优先··分治
黄金小码农1 小时前
C语言二级 2025/1/20 周一
c语言·开发语言·算法
笔耕不辍cj1 小时前
两两交换链表中的节点
数据结构·windows·链表
PaLu-LI2 小时前
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
c++·人工智能·opencv·学习·ubuntu·计算机视觉
csj502 小时前
数据结构基础之《(16)—链表题目》
数据结构
謓泽2 小时前
【数据结构】二分查找
数据结构·算法