Java基础之二叉搜索树的基本操作

 更新时间:2021年05月23日 09:36:27   作者:保护眼睛  
发现许多小伙伴还不清楚Java二叉搜索树的基本操作,今天特地整理了这篇文章,文中有非常详细的代码示例,对正在学习Java的小伙伴很有帮助,需要的朋友可以参考下

一、二叉搜索树插入元素

/**
 * user:ypc;
 * date:2021-05-18;
 * time: 15:09;
 */
     class Node {
        int val;
        Node left;
        Node right;

        Node(int val) {
            this.val = val;
        }
    }
    public void insert(int key) {
        Node node = new Node(key);
        if (this.root == null) {
            root = node;
        }
        Node cur = root;
        Node parent = null;
        while (cur != null) {
            if (cur.val == key) {
                //System.out.println("元素已经存在");
                return;
            } else if (cur.val > key) {
                parent = cur;
                cur = cur.left;
            } else {
                parent = cur;
                cur = cur.right;
            }
        }
        if (key > parent.val) {
            parent.right = node;
        } else {
            parent.left = node;
        }

    }

二、搜索指定节点

 public boolean search(int key) {
        Node cur = root;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            } else if (cur.val > key) {
                cur = cur.left;
            } else {
                cur = cur.right;
            }
        }

        return false;
    }

三、删除节点方式一

 public void removenode1(Node parent, Node cur) {
        if (cur.left == null) {
            if (cur == root) {
                root = cur.right;
            } else if (cur == parent.right) {
                parent.left = cur.right;
            } else {
                parent.right = cur.right;
            }
        } else if (cur.right == null) {
            if (cur == root) {
                root.left = cur;
            } else if (cur == parent.right) {
                parent.right = cur.left;
            } else {
                parent.left = cur.left;
            }
        } else {
            Node tp = cur;
            Node t = cur.right;
            while (t.left != null) {
                tp = t;
                t = t.left;
            }
            if (tp.left == t) {
                cur.val = t.val;
                tp.left = t.right;
            }
            if (tp.right == t) {
                cur.val = t.val;
                tp.right = t.right;
            }
        }

    }

    public void remove(int key) {
        Node cur = root;
        Node parent = null;
        while (cur != null) {
            if (cur.val == key) {
                removenode1(parent, cur);
              //removenode2(parent, cur);
                return;
            } else if (key > cur.val) {
                parent = cur;
                cur = cur.right;
            } else {
                parent = cur;
                cur = cur.left;
            }
        }
    }
  

四、删除节点方式二

 public void removenode2(Node parent, Node cur) {

        if (cur.left == null) {
            if (cur == root) {
                root = cur.right;
            } else if (cur == parent.right) {
                parent.left = cur.right;
            } else {
                parent.right = cur.right;
            }
        } else if (cur.right == null) {
            if (cur == root) {
                root.left = cur;
            } else if (cur == parent.right) {
                parent.right = cur.left;
            } else {
                parent.left = cur.left;
            }
        } else {
            Node tp = cur;
            Node t = cur.left;
            while (t.right != null) {
                tp = t;
                t = t.right;
            }
            if (tp.right == t) {
                cur.val = t.val;
                tp.right = t.left;
            }
            if (tp.left == t) {
                cur.val = t.val;
                tp.left = t.left;
            }
        }

    }

五、运行结果

 /**
 * user:ypc;
 * date:2021-05-18;
 * time: 15:09;
 */
class TestBinarySearchTree {
    public static void main(String[] args) {
        int a[] = {5, 3, 4, 1, 7, 8, 2, 6, 0, 9};
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        for (int i = 0; i < a.length; i++) {
            binarySearchTree.insert(a[i]);
        }
        binarySearchTree.inOrderTree(binarySearchTree.root);
        System.out.println();
        binarySearchTree.preOrderTree(binarySearchTree.root);
        binarySearchTree.remove(7);
        System.out.println();
        System.out.println("方法一删除后");
        binarySearchTree.inOrderTree(binarySearchTree.root);
        System.out.println();
        binarySearchTree.preOrderTree(binarySearchTree.root);
    }
}

在这里插入图片描述
在这里插入图片描述

到此这篇关于Java基础之二叉搜索树的基本操作的文章就介绍到这了,更多相关二叉搜索树的基本操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java获得平台相关的行分隔符和java路径分隔符的方法

    java获得平台相关的行分隔符和java路径分隔符的方法

    不同系统平台下的行分隔符、路径分隔符等常常不同,如何在Java程序获取当前平台的分隔符,以及其他系统相关的状态呢?下面是示例程序,需要的朋友可以参考下
    2014-02-02
  • MyBatis-Plus 自动填充的实现示例

    MyBatis-Plus 自动填充的实现示例

    MyBatis-Plus 提供了自动填充功能,帮助开发者在插入或更新数据时,自动为某些字段赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • springboot如何使用thymeleaf模板访问html页面

    springboot如何使用thymeleaf模板访问html页面

    springboot中推荐使用thymeleaf模板,使用html作为页面展示。那么如何通过Controller来访问来访问html页面呢?下面通过本文给大家详细介绍,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-05-05
  • Java棋类游戏实践之单机版五子棋

    Java棋类游戏实践之单机版五子棋

    这篇文章主要为大家详细介绍了Java棋类游戏中的五子棋实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • java实现打砖块小游戏

    java实现打砖块小游戏

    这篇文章主要为大家详细介绍了java实现打砖块小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • JAVA中常用的设计模式:单例模式,工厂模式,观察者模式

    JAVA中常用的设计模式:单例模式,工厂模式,观察者模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
    2020-04-04
  • Spring 事件监听机制实现跨模块调用的思路详解

    Spring 事件监听机制实现跨模块调用的思路详解

    之前一个项目,有两个模块,A 模块需要依赖 B 模块,但现在 B 模块有地方需要调用 A 模块的方法,如果直接依赖,又会产生循环依赖问题,最终选择使用 spring 的事件监听来解决该问题,下面给大家介绍Spring 事件监听机制实现跨模块调用的思路,感兴趣的朋友一起看看吧
    2024-05-05
  • SpringBoot+Dubbo+Zookeeper知识整合过程详解

    SpringBoot+Dubbo+Zookeeper知识整合过程详解

    本文首先介绍了分布式系统的基本概念和分类,包括单一应用架构、垂直应用架构、分布式服务架构和流动计算架构,通过一个完整的Spring Boot + Dubbo + Zookeeper框架搭建示例,展示了如何将这些技术整合到一个实际的项目中,感兴趣的朋友一起看看吧
    2025-02-02
  • SpringCloud动态配置注解@RefreshScope与@Component的深度解析

    SpringCloud动态配置注解@RefreshScope与@Component的深度解析

    在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍Spring Cloud中相关的注解@RefreshScope与@Component的使用,需要的小伙伴可以参考下
    2025-04-04
  • IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven project的问题

    IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven

    这篇文章主要介绍了IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven project的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论