二叉排序树的插入删除和查找(数据结构实训)(难度系数100)

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

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

pre: 前序遍历
in: 中序遍历
post:后序遍历
insert: 插入,本题中不会出现相同的元素
delete: 删除,删除成功输出TRUE,没有该元素则输出FALSE,删除的方法是如果有左子树,以左子树中最大值作为新的树根,否则,以右子树最小值作为树根。
search: 查找,存在该元素输出YES, 否则输出NO
exit:退出
输入:
输入的第一行为整数 N
接下来一行为N个整数,你需要把这N个整数构建出相应的二叉排序树
之后是一组指令。

输出:
根据相应的指令进行输出。说明:遍历各元素之间用一个空格隔开。

样例输入:
10
31 15 9 5 4 7 8 50 42 2
pre
in
post
delete
15
delete
88
in
search
8
search
222
insert
15
pre
in
post
exit

样例输出:

31 15 9 5 4 2 7 8 50 42
2 4 5 7 8 9 15 31 42 50
2 4 8 7 5 9 15 42 50 31
TRUE
FALSE
2 4 5 7 8 9 31 42 50
YES
NO
31 9 5 4 2 7 8 15 50 42
2 4 5 7 8 9 15 31 42 50
2 4 8 7 5 15 9 42 50 31

注意:在样例中,我先把15删除掉了,然后再插入15,观察最开始的三个遍历,和最后的三次遍历,遍历结果是有区别的。文章来源地址https://www.toymoban.com/news/detail-822175.html

import java.util.*;

public class Xingyuxingxi {
    static TreeNode root;
    static boolean pd;//定义全局变量,就无需导入到方法里面
    public static class TreeNode{
        TreeNode lc;
        TreeNode rc;
        int item;
        public TreeNode(int item) {
            this.item=item;
        }
    }
    public static TreeNode insert(TreeNode root,int item) {
        if(root==null) {//如果要插入的位置为空,则直接加入新结点
            root=new TreeNode(item);
        }
        else if(item > root.item) {//如果插入的数大该结点的数则进该结点的右子树找位置
            root.rc=insert(root.rc,item);
        }
        else if(item< root.item) {//如果插入的数小于该结点的数则进该结点的左子树找位置
            root.lc=insert(root.lc,item);
        }
        return root;
    }
    public static TreeNode delete(TreeNode root,int item){
        if(root==null)
        {
            return null;
        }
    if(root.item==item) {
        pd=true;
        if (root.lc == null && root.rc == null) {//如果删除的结点左子树和右子树都为空
            root = null;//则直接删除该结点
        } else if (root.lc != null) {//如果删除结点的左子树不为空,应该在左子树中找到最大的结点
            TreeNode node1 = root.lc;//储存该结点的左子树结点
            TreeNode node2 = root.lc;//储存该结点的左子树结点
            while (node1.rc != null) {//最大的值肯定在左子树结点的右子树上,如果没有则该结点就是最大值,因为二叉搜索树要求左子树小于前结点,右子树大于前结点
                node2 = node1;
                node1 = node1.rc;
            }//如果进了循环,则node1和node2不相等
            if (node1 != node2) {//如果不相等表示,则node2储存的将会是node1的父亲结点,node1储存的是node2的右子树结点
                node2.rc = node1.lc;//让node2右子树结点连接node1的左子树结点,此时node1已经是最大的,所以没有右子树
                root.item = node1.item;//删除结点用删除结点左子树的最大值替换
            } else {//如果两个储存的结点相等,则该结点无右结点,只需要将删除结点替换为该结点并且连接其原本的左子树结点即可
                root.item = node1.item;
                root.lc = node1.lc;
            }
        } else {//如果删除结点的右子树不为空,应该在右子树中找到最小的结点
            TreeNode node1 = root.rc;//储存该结点的左子树结点
            TreeNode node2 = root.rc;//储存该结点的左子树结点
            while (node1.lc != null) {//最小的值肯定在右子树结点的左子树上,如果没有则该结点就是最小值,因为二叉搜索树要求左子树小于前结点,右子树大于前结点
                node2 = node1;
                node1 = node1.lc;
            }//如果进了循环,则node1和node2不相等
            if (node2 != node1) {//如果不相等表示,则node2储存的将会是node1的父亲结点,node1储存的是node2的左子树结点
                node2.lc = node1.rc;//让node2左子树结点连接node1的右子树结点,此时node1已经是最小的,所以没有左子树
                root.item = node1.item;//删除结点用删除结点左子树的最大值替换
            } else {//如果两个储存的结点相等,则该结点无左结点,只需要将删除结点替换为该结点并且连接其原本的右子树结点即可
                root.item = node1.item;
                root.rc = node1.rc;
            }
        }
    }
    else if(item<root.item){//如果删除的结点比该结点小,进左子树找
        root.lc=delete(root.lc,item);
    }
    else {//如果大则进右子树找
        root.rc=delete(root.rc,item);
    }
    return root;
    }
    public static void search(int item) {
        TreeNode node = root;
        while(node!=null) {
            if(item<node.item){//如果小于该结点则进左边找
                node=node.lc;
            } else if (item>node.item){//大于则进右边找
                node=node.rc;
            }else {//找到了就退出
                pd=true;//标记为true
                break;
            }
        }
    }
    public static void pre(TreeNode root) {//先序遍历递归顺序,中左右
        if(root==null) {//如果根结点为空则返回
            return;
        }
        System.out.print(root.item+" ");//中
        pre(root.lc);//左
        pre(root.rc);//右
    }
    public static void in(TreeNode root) {//中序遍历递归顺序,左中右
        if(root==null) {//如果根结点为空则返回
            return;
        }
        in(root.lc);//左
        System.out.print(root.item+" ");//中
        in(root.rc);//右
    }
    public static void post(TreeNode root) {//后序遍历递归顺序,左右中
        if(root==null) {//如果根结点为空则返回
            return;
        }
        post(root.lc);//左
        post(root.rc);//右
        System.out.print(root.item+" ");//中
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        root=null;//初始化
        for (int i = 0; i < n; i++) {
            int item=sc.nextInt();
            root=insert(root,item);//就是插入操作
        }
        String str;
        while(sc.hasNext()) {
            str=sc.next();
            if(str.equals("exit")) {//退出
                break;
            } else if(str.equals("insert")) {//插入
                int item=sc.nextInt();
                root=insert(root,item);
            } else if(str.equals("delete")) {//删除
            int item=sc.nextInt();
            pd=false;
            root=delete(root,item);
            if(pd){//如果成功删除"TRUE"
                System.out.println("TRUE");
            }else {//否则"FALSE",实际上只有没有要删除的数才为"FALSE"
                System.out.println("FALSE");
            }
            } else if(str.equals("search")) {//查找
            int item= sc.nextInt();
            pd=false;
            search(item);
            if(pd){//找到则为"YES"
                System.out.println("YES");
            } else {//否则为"NO"
                System.out.println("NO");
            }
            } else if(str.equals("pre")) {//先序遍历
            pre(root);
            System.out.println();
            } else if(str.equals("in")) {//中序遍历
            in(root);
            System.out.println();
            } else if(str.equals("post")) {//后序遍历
            post(root);
            System.out.println();
            }
        }
    }
}

到了这里,关于二叉排序树的插入删除和查找(数据结构实训)(难度系数100)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索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日
    浏览(63)
  • 【数据结构】【算法】二叉树、二叉排序树、树的相关操作

    树结构是以分支关系定义的一种层次结构,应用树结构组织起来的数据,逻辑上都具有明显的层次关系。 操作系统中的文件管理系统、网络系统中的域名管理、数据库系统中的索引管理等都使用了树结构来组织和管理数据。 树 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)用二叉链表作存储结构: ①读入一个整数序列L(要求该整数序列从磁盘文件读取),生成一棵二叉排序树②对二叉排序树T作中序遍历,输出结果

    2024年02月12日
    浏览(45)
  • 数据结构----完全二叉树的时间复杂度讲解,堆排序

    目录 一.建堆的时间复杂度 1.向上调整算法建堆 2.向下调整算法建堆 二.堆排序 1.概念 2.代码思路 3.代码实现 我们就以极端情况考虑时间复杂度(满二叉树+遍历所有层) 假设所有节点个数为N,树的高度为h N = 2^0+2^1+2^2......+2^(h-1) 即N = 2^h - 1 h = log(N+1) 时间复杂度我们以交换次数为

    2024年03月14日
    浏览(65)
  • 数据结构07:查找[C++][平衡二叉排序树AVL]

    图源:文心一言 考研笔记整理1w+字,小白友好、代码可跑,请小伙伴放心食用~~🥝🥝 第1版:查资料、写BUG、画导图、画配图~🧩🧩 参考用书: 王道考研《2024年 数据结构考研复习指导》 参考用书配套视频: 7.3_2 平衡二叉树_哔哩哔哩_bilibili 特别感谢:  Chat GPT老师、文心

    2024年02月11日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包