二叉排序树的创建、插入、查找和删除【数据结构】

这篇具有很好参考价值的文章主要介绍了二叉排序树的创建、插入、查找和删除【数据结构】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二叉排序树

  • 若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。
  • 若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。
  • 它的左、右树又分为⼆叉排序树

二叉排序树也叫二叉查找树、二叉搜索树

二叉排序树的创建、插入、查找和删除

创建和插入

题目描述
给出一个数据序列,建立二叉排序树,并实现插入功能。
在建立和插入操作后,都输出二叉树的先序遍历结果i

输入
第1行输入n,表示序列包含n个数据
第2行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第3行输入m,表示要插入m个数据
输入m行,每行一个要插入的数据,都是自然数且和前面的数据不等

输出
第一行输出一开始构建的二叉排序树的先序遍历结果
从第二行起,输出m行,每行输出插入一个数据到二叉排序树后的先序遍历结果
每行输出的遍历结果中,每个数据后面都带一个空格,最后一个数据也带。

输入样例1
6
22 33 55 66 11 44
3
77
50
10

输出样例1
22 11 33 55 44 66
22 11 33 55 44 66 77
22 11 33 55 44 50 66 77
22 11 10 33 55 44 50 66 77

输入样例2
6
33 55 22 66 11 44
3
25
88
50

输出样例2
33 22 11 55 44 66
33 22 11 25 55 44 66
33 22 11 25 55 44 66 88
33 22 11 25 55 44 50 66 88

#include<bits/stdc++.h>
using namespace std;
//树节点
struct tree
{
    int value=0;
    tree* left=NULL;
    tree* right=NULL;
};
//插入操作
tree* insert(tree* t,int a)
{
    tree* root=t;
    while(1)
    {
        if(t->value==0) 
        {
            t->value=a;
            break;
        }
        if(a<t->value) 
        {
            if(!t->left) t->left=new tree;
            t=t->left;
        }
        else 
        {
            if(!t->right) t->right=new tree;
            t=t->right; 
        }
    }
    return root;
}
//先序遍历
void prior(tree* t)
{
    if(t==NULL) return ;
    cout<<t->value<<" ";
    prior(t->left);
    prior(t->right);
}
int main()
{
    int n;
    cin>>n;
    tree* root=new tree;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        root=insert(root,x);
    }
    prior(root);
    cout<<endl;
    int m;
    cin>>m;
    for(int i=0;i<m;i++) 
    {
        int x;
        cin>>x;
        //插入
        root=insert(root,x);
        prior(root);
        cout<<endl;
    }
    return 0;
}

查找

题目描述
给出一个数据序列,建立二叉排序树,并实现查找功能

输入
第1行输入n,表示首个序列包含n个数据
第2行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第3行输入m,表示要查找m个数据
接着输入m行,每行一个要查找的数据,都是自然数
以此类推输入下一个示例

输出
第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到
从第二行起,输出查找结果,如果查找成功输出查找次数,如果查找失败输出-1

输入样例1
6
22 33 55 66 11 44
7
11
22
33
44
55
66
77

输出样例1
11 22 33 44 55 66
2
1
2
4
3
4
-1

输入样例2
6
33 22 55 11 66 44
4
88
11
44
66

输出样例2
11 22 33 44 55 66
-1
3
3
3

#include<bits/stdc++.h>
using namespace std;
//树节点
struct tree
{
    int value=0;
    tree* left=NULL;
    tree* right=NULL;
};
//插入
tree* insert(tree* t,int a)
{
    tree* root=t;
    while(1)
    {
        if(t->value==0) 
        {
            t->value=a;
            break;
        }
        if(a<t->value) 
        {
            if(!t->left) t->left=new tree;
            t=t->left;
        }
        else 
        {
            if(!t->right) t->right=new tree;
            t=t->right; 
        }
    }
    return root;
}
//中序遍历
void middle(tree* t)
{
    if(t==NULL) return ;
    middle(t->left);
    cout<<t->value<<" ";
    middle(t->right);
}
//查找
int find(tree* t,int a,int time)
{
    while(1)
    {
        time++;
        if(t->value==0)
        {
            time=-1;
            break;
        }
        if(t->value==a) break;
        if(a<t->value)
        {
            if(!t->left) t->left=new tree;
            t=t->left;
        }
        else
        {
            if(!t->right) t->right=new tree;
            t=t->right;
        }
    }
    return time;
}
int main()
{
    int n;
    cin>>n;
    tree* root=new tree;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        root=insert(root,x);
    }
    middle(root);
    cout<<endl;
    int m;
    cin>>m;
    for(int i=0;i<m;i++)
    {
        int x;
        cin>>x;
        cout<<find(root,x,0)<<endl;
    }
    return 0;
}

删除

题目描述
给出一个数据序列,建立二叉排序树,并实现删除功能
对二叉排序树进行中序遍历,可以得到有序的数据序列

输入
第一行输入t,表示有t个数据序列
第二行输入n,表示首个序列包含n个数据
第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第四行输入m,表示要删除m个数据
从第五行起,输入m行,每行一个要删除的数据,都是自然数
以此类推输入下一个示例

输出
第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到
从第二行起,输出删除第m个数据后的有序序列,输出m行
以此类推输出下一个示例的结果

输入样例1
1
6
22 33 55 66 11 44
3
66
22
77

输出样例1
11 22 33 44 55 66
11 22 33 44 55
11 33 44 55
11 33 44 55

提示
当删除数据不在序列中,那么删除操作等于不执行,所以输出序列不变化文章来源地址https://www.toymoban.com/news/detail-819681.html

  1. 被删除的节点是叶子节点,将双亲节点中相应的指针域的值改为空
  2. 被删除的节点只有左子树或右子树,将要删除的节点的双亲节点相应指针域的值指向被删除节点的左子树或者右子树
  3. 被删除节点既有左子树又有右子树,将左子树中的最大值或者右子树中的最小值代替该节点
#include<bits/stdc++.h>
using namespace std;
//树节点
struct tree
{
    int value=0;
    tree* left=NULL;
    tree* right=NULL;
};
//插入
tree* insert(tree* t,int a)
{
    tree* root=t;
    while(1)
    {
        if(t->value==0) 
        {
            t->value=a;
            break;
        }
        if(a<t->value) 
        {
            if(!t->left) t->left=new tree;
            t=t->left;
        }
        else 
        {
            if(!t->right) t->right=new tree;
            t=t->right; 
        }
    }
    return root;
}
//中序遍历
void middle(tree* t)
{
    if(t==NULL||t->value==0) return ;
    middle(t->left);
    cout<<t->value<<" ";
    middle(t->right);
}
//删除
void del(tree* t,int a)
{
    //记录父节点
    tree* p=NULL;
    while(1)
    {
        if(t->value==0) break;
        if(t->value==a)
        {
            //叶子结点直接删除
            if(!t->left&&!t->right)
            {
                if(p->left==t) p->left=NULL;
                else p->right=NULL;
                break;
            }
            //只有左子树或只有右子树
            if(!t->left||!t->right)
            {
                //左子树不空
                if(t->left)
                {
                    if(p->left==t) p->left=t->left;
                    else p->right=t->left;
                    break;
                }
                //右子树不空
                if(t->right)
                {
                    if(p->left==t) p->left=t->right;
                    else p->right=t->right;
                    break;
                }
            }
            //左右子树都不空
            //本做法是用左子树最大值代替该节点值
            tree* now=t->left;
            tree* par=t;
            while(now->right) 
            {
                par=now;
                now=now->right;
            }
            //左子树最大值
            int value=now->value;
            //更新值
            t->value=value;
            //这里注意!!!
            if(!now->left&&!now->right) 
            {
                //直接删除左子树的根节点
                if(par==t) par->left=NULL;
                //删除的不是左子树的根节点
                else par->right=NULL;
            }
            //有子节点肯定是左子节点
            else par->right=now->left;
            break;
        }
        if(a<t->value)
        {
            if(!t->left) t->left=new tree;
            p=t;
            t=t->left;
        }
        else
        {
            if(!t->right) t->right=new tree;
            p=t;
            t=t->right;
        }
    }
}
int main()
{
    int t;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        int n;
        cin>>n;
        tree* root=new tree;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            root=insert(root,x);
        }
        middle(root);
        cout<<endl;
        int m;
        cin>>m;
        for(int i=0;i<m;i++) 
        {
            int x;
            cin>>x;
            del(root,x);
            middle(root);
            cout<<endl;
        }
    }
    return 0;
}

到了这里,关于二叉排序树的创建、插入、查找和删除【数据结构】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉排序树的定义及基本操作(构造、查找、插入、删除)递归及非递归算法

    二叉排序树(Binary Sort Tree, BST),也称二叉查找树。 二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树: 1) 若左子树非空,则左子树上所有结点均小于根结点的值; 2) 若右子树非空,则右子树上所有结点均大于根结点的值;

    2024年02月08日
    浏览(60)
  • 【数据结构】18 二叉搜索树(查找,插入,删除)

    二叉搜索树也叫二叉排序树或者二叉查找树。它是一种对排序和查找都很有用的特殊二叉树。 一个二叉搜索树可以为空,如果它不为空,它将满足以下性质: 非空左子树的所有键值小于其根节点的键值 非空右子树的所有键值都大于其根结点的键值 左、右子树都是二叉树 在

    2024年02月22日
    浏览(49)
  • 【数据结构】单链表基本操作:查找、插入、删除、创建

     链表由结点组成,结点由数据域和指针域组成。其中,数据域存放的就是数据元素,指针域存放下一个结点的地址。数据元素可以只有一个,也可以有多个不同类型的数据元素,甚至是数组。下图和代码来自《C Primer Plus》,该链表每个节结点同时含char类型和int类型。 ​​

    2024年02月02日
    浏览(64)
  • 【数据结构】(顺序表)C语言实现线性表顺序存储的创建、插入、删除、查找、输出等基本操作(附完整代码)

    要求:利用书本上的线性表的顺序存储结构定义 #define MAXSIZE 100 //顺序表可能达到的最大长度 typedef struct{ ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) } SqList; 1)编写完成下列功能的函数: (1)初始化一个线性表

    2024年04月28日
    浏览(49)
  • 考研算法第十三天:二叉排序树 【二叉排序树的插入和遍历】

    这道题很妙。题目给的二叉排序树好像没学过其实就是二叉查找树。然后这道题主要的就是思路     1.先找到那个要删除节点所在处     2.找到之后处理分三种情况     删除的节点是叶节点,直接删除即可     删除的节点只有右节点或者左节点 将左节点或者右节点删除即可

    2024年02月05日
    浏览(49)
  • 二叉搜索树(查找、插入、删除的讲解实现+图文并茂)

    目录 1. 二叉搜索树(BST)   1.1 二叉搜索树概念   1.2 二叉搜索树操作         1.2.1 二叉搜索树的查找         1.2.2 二叉搜索树的插入          1.2.3 二叉搜索树的删除 2. 二叉搜索树的实现   2.1BST基本结构   2.2 BST操作成员函数(非递归)   2.3 BST操作成员函数(递归) 3. 二

    2024年02月06日
    浏览(61)
  • 【数据结构】【算法】二叉树、二叉排序树、树的相关操作

    树结构是以分支关系定义的一种层次结构,应用树结构组织起来的数据,逻辑上都具有明显的层次关系。 操作系统中的文件管理系统、网络系统中的域名管理、数据库系统中的索引管理等都使用了树结构来组织和管理数据。 树 Tree 是由n个节点组成的有限集合。在任意一颗非

    2024年02月04日
    浏览(53)
  • 【数据结构】二叉排序树——平衡二叉树的调整

    参考视频: 懒猫老师-数据结构-(59)平衡二叉树【互动视频】 (1)什么是平衡二叉树 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉查找树,它的目的是保持树的高度尽量平衡,以保证查找、插入、删除等操作的时间复杂度为 O(log n)。 常见的平衡二叉树算法包括 AVL 树、红

    2024年02月04日
    浏览(39)
  • 数据结构-二叉排序树(建立、查找、修改)

    二叉排序树是动态查找表的一种,也是常用的表示方法。 其中,它具有如下性质: 1.若它的左子树非空,则其左子树的所有节点的关键值都小于根节点的关键值。 2.若它的右子树非空,则其右子树的所有节点的关键值都大于根结点的关键值。 3.它的左右子树也分别都是二叉排

    2024年02月04日
    浏览(44)
  • Java学数据结构(2)——树Tree & 二叉树binary tree & 二叉查找树 & AVL树 & 树的遍历

    1.树的出现:解决链表线性访问时间太慢,树的时间复杂度O(logN); 2.二叉树的定义,最多两个儿子节点; 3.二叉查找树,左小,右大,中居中;remove方法,两种,只有一个儿子节点,有两个儿子节点; 4.AVL树,在二叉查找树基础上加平衡条件,旋转方法,单旋转,双旋转;

    2024年02月10日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包