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基础之二叉搜索树的基本操作的文章就介绍到这了,更多相关二叉搜索树的基本操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 很详细的Log4j配置步骤

    很详细的Log4j配置步骤

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
    2008-11-11
  • SpringBoot 如何将项目打包成 jar 包

    SpringBoot 如何将项目打包成 jar 包

    这篇文章主要介绍了SpringBoot如何将项目打包成jar包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • SpringBoot整合多个Mq服务做法详解

    SpringBoot整合多个Mq服务做法详解

    SpringBoot整合rabbitmq很容易,但是整合的目的是为了使用,那要使用rabbitmq就要对其有一定的了解,不然容易整成一团浆糊。因为说到底,SpringBoot只是在封装rabbitmq的API,让其更容易使用而已,废话不多说,让我们一起整它
    2023-02-02
  • 命令提示符编译java的方法(必看篇)

    命令提示符编译java的方法(必看篇)

    下面小编就为大家带来一篇命令提示符编译java的方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 通过Session案例分析一次性验证码登录

    通过Session案例分析一次性验证码登录

    这篇文章主要介绍了通过Session案例分析一次性验证码登录,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    这篇文章主要介绍了Springboot+SpringSecurity+JWT实现用户登录和权限认证示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java编程异常简单代码示例

    Java编程异常简单代码示例

    这篇文章主要介绍了Java编程异常简单代码示例,还是比较不错的,这里分享个大家,需要的朋友可以参考下。
    2017-11-11
  • Java中finally关键字对返回值的影响详解

    Java中finally关键字对返回值的影响详解

    这篇文章主要介绍了Java中finally关键字对返回值的影响详解,执行完try catch里面内容准备return时,如果还有finally需要执行这是编译器会为我们增加一个全局变量去暂存return 的值,等到finally执行完成去return这个全局变量,需要的朋友可以参考下
    2024-01-01
  • Spring IOC容器Bean注解创建对象组件扫描

    Spring IOC容器Bean注解创建对象组件扫描

    这篇文章主要为大家介绍了Spring IOC容器Bean注解创建对象组件扫描,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Elasticsearch Analyzer 内置分词器使用示例详解

    Elasticsearch Analyzer 内置分词器使用示例详解

    这篇文章主要为大家介绍了Elasticsearch Analyzer 内置分词器使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论