iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java如何实现二分搜索树
  • 947
分享到

Java如何实现二分搜索树

2023-06-29 13:06:19 947人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关Java如何实现二分搜索树,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.概念a.是个二叉树(每个节点最多有两个子节点)b.对于这棵树中的节点的节点值左子树中的所有节点值 &

这篇文章将为大家详细讲解有关Java如何实现二分搜索树,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.概念

a.是个二叉树(每个节点最多有两个子节点)

b.对于这棵树中的节点的节点值

左子树中的所有节点值 < 根节点 < 右子树的所有节点值

二分搜索树中一般不考虑值相等的情况(元素不重复)jdk中的搜索树就不存在相同的值(TreeMap-key)

Java如何实现二分搜索树

最大特点:也是判断是否是搜索树的方法

对该树进行中序遍历,就可以得到一个升序集合0 1 2 3 4 5 6 7 8 9

在一个有序区间上进行二分查找的时间复杂度? logn不断将集合/2/2 / 2 ==1为止logN

logN =》联想到"树"

2.重点操作

Java如何实现二分搜索树

当删除58时,此节点左右子树都不为空

Hibbard Deletion 1962

在BST中删除一个左右子树都存在的节点

找到当前以58为根节点的前驱或者后继节点作为删除后的新节点

前驱:在以58为根的BST中最后一个小于58的节点->53

后继:在以58为根的BST中第一个大于58的节点->59

当我们使用后继节点时,先连removeMin(root.right),在连root.left

Treenode successor = findMin(root.right);successor.right = removeMin(root.right);successor.left = root.left;

3.完整代码

import java.util.NoSuchElementException; public class BST {     private class TreeNode{        private int val;        private TreeNode left;        private TreeNode right;         public TreeNode(int val) {            this.val = val;        }    }     private int size;    private TreeNode root;         public void add(int val){        root = add(root,val);    }     private TreeNode add(TreeNode root, int val) {        if(root == null){            //创建一个新节点            TreeNode newNode = new TreeNode(val);            size++;            return newNode;        }        //左子树插入        if(val < root.val){            root.left = add(root.left,val);        }        //右子树插入        if(val > root.val){            root.right = add(root.right,val);        }        return root;    }         public boolean contains(int val){        return contains(root,val);    }     private boolean contains(TreeNode root, int val) {        if(root == null){            return false;        }        if(val == root.val){            //找到了            return true;        }else if(val < root.val){            //递归左子树查找            return contains(root.left,val);        }else{            //递归右子树查找            return contains(root.right,val);        }    }         public int findMin(){        //判空        if(root == null){            //抛出一个空指针异常            throw new NoSuchElementException("root is empty! cannot find min");        }        TreeNode minNode = findMin(root);        return minNode.val;    }     private TreeNode findMin(TreeNode root) {        //当此节点左子树为空,说明此节点是最小值        if(root.left == null){            return root;        }        //递归访问左子树        return findMin(root.left);    }         public int findMax(){        //判空        if(root == null){            throw new NoSuchElementException("root is empty! cannot find max");        }        TreeNode maxNode = findMax(root);        return maxNode.val;    }     private TreeNode findMax(TreeNode root) {        //当此节点右子树为空,说明此节点是最大值        if(root.right == null){            return root;        }        //递归访问右子树        return findMax(root.right);    }         public int removeMin(){        int min =findMin();        root = removeMin(root);        return min;    }     private TreeNode removeMin(TreeNode root) {        if(root.left == null){            TreeNode right = root.right;            //找到最小值,删除节点            root = root.left = null;            size--;            return right;        }        root.left = removeMin(root.left);        return root;    }         public int removeMax(){        int max = findMax();        root = removeMax(root);        return max;    }     //在当前以root为根的BST中删除最小值所在的节点,返回删除后的树根    private TreeNode removeMax(TreeNode root) {        if(root.right == null){            TreeNode right = root.right;            //找到最大值,删除节点            root = root.right = null;            size--;            return right;        }        root.right = findMax(root.right);        return root;    }         public void removeValue(int value){        root = removeValue(root,value);    }     private TreeNode removeValue(TreeNode root, int value) {        if(root == null){            throw new NoSuchElementException("root is empty! cannot find remove");        }else if(value < root.val){            root.left = removeValue(root.left,value);            return root;        }else if(value > root.val){            root.right = removeValue(root.right,value);            return root;        }else {            //此时value == root.value            if(root.left == null){                //删除最小数                TreeNode right = root.right;                root = root.right = null;                size--;                return right;            }            if(root.right == null){                //删除最大数                TreeNode left = root.left;                root = root.left =null;                size--;                return left;            }            //找到当前该删除节点的前驱或者后继节点作为删除后的新节点            //当我们使用后继节点时,先连removeMin(root.right),在连root.left            TreeNode successor = findMin(root.right);            successor.right = removeMin(root.right);            successor.left = root.left;            return successor;        }    }      @Override    public String toString() {        StringBuilder sb = new StringBuilder();        generateBSTString(root,0,sb);        return sb.toString();    }     //直观打印,可以看到树的深度    private void generateBSTString(TreeNode root, int height, StringBuilder sb) {        if(root == null){            sb.append(generateHeightString(height)).append("NULL\n");            return;        }        sb.append(generateHeightString(height)).append(root.val).append("\n");        generateBSTString(root.left,height+1,sb);        generateBSTString(root.right,height+1,sb);    }     private String generateHeightString(int height) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < height; i++) {            sb.append("--");        }        return sb.toString();    }}

关于“Java如何实现二分搜索树”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java如何实现二分搜索树

本文链接: https://www.lsjlt.com/news/325001.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java如何实现二分搜索树
    这篇文章将为大家详细讲解有关Java如何实现二分搜索树,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.概念a.是个二叉树(每个节点最多有两个子节点)b.对于这棵树中的节点的节点值左子树中的所有节点值 &...
    99+
    2023-06-29
  • 利用java实现二叉搜索树
    目录二叉搜索树的定义实现一颗二叉搜索树二叉搜索树的定义类二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的定义 它是一颗二叉树 任一节点的左子树上的所有节...
    99+
    2024-04-02
  • Java实现二分搜索树的示例代码
    目录1.概念2.重点操作3.完整代码1.概念 a.是个二叉树(每个节点最多有两个子节点) b.对于这棵树中的节点的节点值 左子树中的所有节点值 < 根节点 < 右子树的所...
    99+
    2024-04-02
  • java二叉搜索树使用实例分析
    本篇内容主要讲解“java二叉搜索树使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java二叉搜索树使用实例分析”吧!概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性...
    99+
    2023-06-29
  • 如何利用JavaScript实现二叉搜索树
    计算机科学中最常用和讨论最多的数据结构之一是二叉搜索树。这通常是引入的第一个具有非线性插入算法的数据结构。二叉搜索树类似于双链表,每个节点包含一些数据,以及两个指向其他节点的指针;它...
    99+
    2024-04-02
  • C++如何实现验证二叉搜索树
    本文小编为大家详细介绍“C++如何实现验证二叉搜索树”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++如何实现验证二叉搜索树”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。验证二叉搜索树Example 1:In...
    99+
    2023-06-19
  • 如何通过代码实现二叉搜索树
    本篇内容主要讲解“如何通过代码实现二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过代码实现二叉搜索树”吧!首先,二叉搜索树到底是什么二叉搜索树(...
    99+
    2024-04-02
  • C++二叉搜索树实例分析
    本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer&...
    99+
    2023-06-19
  • 什么是二分搜索树
    这篇文章主要介绍“什么是二分搜索树”,在日常操作中,相信很多人在什么是二分搜索树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是二分搜索树”的疑惑有所帮助!接下来,请跟着...
    99+
    2024-04-02
  • 如何在Java中操作二叉搜索树
    如何在Java中操作二叉搜索树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、二叉搜索树插入元素     class&n...
    99+
    2023-06-15
  • 何为二叉搜索树
    本篇内容主要讲解“何为二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“何为二叉搜索树”吧!什么是树树是一种数据结构,它是由n(n>=1)个有限结点...
    99+
    2024-04-02
  • C++如何实现LeetCode之复原二叉搜索树
    这篇文章给大家分享的是有关C++如何实现LeetCode之复原二叉搜索树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 99. Recover Binary Search Tree 复原二叉搜...
    99+
    2023-06-20
  • 【Java 数据结构】实现一个二叉搜索树
    目录  1、认识二叉搜索树 2、实现一个二叉搜索树 2.1 成员变量 2.2 insert 方法 2.3 search 方法  2.4 remove 方法(重点) 3、二叉搜索树总结 1、认识二叉搜索树 从字面上来看,它只比二叉树多...
    99+
    2023-09-02
    数据结构 算法 二叉搜索树
  • Java数据结构之二叉搜索树实例分析
    这篇文章主要介绍“Java数据结构之二叉搜索树实例分析”,在日常操作中,相信很多人在Java数据结构之二叉搜索树实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之二叉搜索树实例分析”的疑...
    99+
    2023-06-30
  • Java创建二叉搜索树,实现搜索,插入,删除的操作实例
    Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除)首先我们要有一个编码的思路,大致如下: 1、查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查找值大于当前节点时向右走,反之向左走!2、...
    99+
    2023-05-30
    java 二叉搜索树 搜索
  • Java简单几步实现一个二叉搜索树
    目录1、认识二叉搜索树2、实现一个二叉搜索树2.1 成员变量2.2 insert 方法2.3 search 方法2.4 remove 方法(重点)3、二叉搜索树总结1、认识二叉搜索树...
    99+
    2023-02-08
    Java二叉搜索树 Java二叉树
  • Java中如何把二叉搜索树转换为累加树
    这篇文章主要介绍了Java中如何把二叉搜索树转换为累加树,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、题目给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加...
    99+
    2023-06-25
  • C++简单实现与分析二叉搜索树流程
    目录二叉搜索树二叉搜索树的重要操作二叉搜索树实现(key模型)二叉搜索树的应用二叉搜索树的实现(key/value模型)二叉搜索树 二叉搜索树又被称为二叉排序树。它可以是一个空树,如...
    99+
    2024-04-02
  • Java实现二叉搜索树的插入、删除功能
    二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode rig...
    99+
    2024-04-02
  • Java 求解如何把二叉搜索树转换为累加树
    一、题目 给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作