广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java基础二叉搜索树图文详解
  • 400
分享到

java基础二叉搜索树图文详解

2024-04-02 19:04:59 400人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录概念直接实践准备工作:定义一个树节点的类,和二叉搜索树的类。搜索二叉树的查找功能搜索二叉树的插入操作搜索二叉树 删除节点的操作 - 难点性能分析总程序 - 模拟实现二叉搜索树和

概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
1、若它的左子树不为空,则左子树上所有节点的值都小于根结点的值。
2、若它的右子树不为空,则右子树上所有节点的值都大于根结点的值。
3、它的左右子树也分别为二叉搜索树

直接实践

准备工作:定义一个树节点的类,和二叉搜索树的类。

搜索二叉树的查找功能

假设我们已经构造好了一个这样的二叉树,如下图

我们要思考的第一个问题是如何查找某个值是否在该二叉树中?

根据上述的逻辑,我们来把搜索的方法进行完善。

搜索二叉树的插入操作

根据上述逻辑,我们来写一个插入节点的代码。

搜索二叉树 删除节点的操作 - 难点

再来分析一下:curDummy 和 parentDummy 是怎么找到“替罪羊”的。

总程序 - 模拟实现二叉搜索树

class Treenode{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val){
        this.val = val;
    }
}


public class BinarySearchTree {
    TreeNode root;

    //在二叉树中 寻找指定 val 值的节点
    // 找到了,返回其节点地址;没找到返回 null
    public TreeNode search(int key){
        TreeNode cur = this.root;
        while(cur != null){
            if(cur.val == key){
                return cur;
            }else if(cur.val < key){
                cur = cur.right;
            }else{
                cur = cur.left;
            }
        }
        return null;
    }
    // 插入操作
    public boolean insert(int key){
        if(this.root == null){
            this.root = new TreeNode(key);
            return true;
        }
        TreeNode cur = this.root;
        TreeNode parent = null;
        while(cur!=null){
            if(key > cur.val){
                parent  = cur;
                cur = cur.right;
            }else if(cur.val == key){
                return false;
            }else{
                parent  = cur;
                cur = cur.left;
            }
        }
        TreeNode node = new TreeNode(key);
        if(parent .val > key){
            parent.left = node;
        }else{
            parent.right = node;
        }
        return true;
    }
    // 删除操作
    public void remove(int key){
        TreeNode cur = root;
        TreeNode parent = null;
        // 寻找 删除节点位置。
        while(cur!=null){
            if(cur.val == key){
                removeNode(cur,parent);// 真正删除节点的代码
                break;
            }else if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else{
                parent = cur;
                cur = cur.left;
            }
        }
    }
    // 辅助删除方法:真正删除节点的代码
    private void removeNode(TreeNode cur,TreeNode parent){
        // 情况一
        if(cur.left == null){
            if(cur == this.root){
                this.root = this.root.right;
            }else if( cur == parent.left){
                parent.left = cur.right;
            }else{
                parent.right = cur.right;
            }
            // 情况二
        }else if(cur.right == null){
            if(cur == this.root){
                this.root = root.left;
            }else if(cur == parent.left){
                parent.left = cur.left;
            }else{
                parent.right = cur.left;
            }
            // 情况三
        }else{
            // 第二种方法:在删除节点的右子树中寻找最小值,
            TreeNode parentDummy = cur;
            TreeNode curDummy = cur.right;
            while(curDummy.left != null){
                parentDummy = curDummy;
                curDummy = curDummy.left;
            }
            // 此时 curDummy 指向的 cur 右子树
            cur.val = curDummy.val;
            if(parentDummy.left != curDummy){
                parentDummy.right = curDummy.right;
            }else{
                parentDummy.left = curDummy.right;
            }

        }
    }
   // 中序遍历
    public void inorder(TreeNode root){
        if(root == null){
            return;
        }
        inorder(root.left);
        System.out.print(root.val+" ");
        inorder(root.right);
    }

    public static void main(String[] args) {
        int[] array = {10,8,19,3,9,4,7};
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        for (int i = 0; i < array.length; i++) {
            binarySearchTree.insert(array[i]);
        }
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();// 换行
        System.out.print("插入重复的数据 9:" + binarySearchTree.insert(9));
        System.out.println();// 换行
        System.out.print("插入不重复的数据 1:" + binarySearchTree.insert(1));
        System.out.println();// 换行
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();// 换行
        binarySearchTree.remove(19);
        System.out.print("删除元素 19 :");
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();// 换行
        System.out.print("查找不存在的数据50 :");
        System.out.println(binarySearchTree.search(50));
        System.out.print("查找存在的数据 7:");
        System.out.println(binarySearchTree.search(7));
    }
}

性能分析

  插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

  对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。

  但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

如果我们能保证 二叉搜索树的左右子树高度差不超过1。尽量满足高度平衡条件。
这就成 AVL 树了(高度平衡的二叉搜索树)。而AVL树,也有缺点:需要一个频繁的旋转。浪费很多效率。
至此 红黑树就诞生了,避免更多的旋转。

和 java 类集的关系

TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的二叉搜索树,即在二叉搜索树的基础之上 + 颜色以及红黑树性质验证,关于红黑树的内容,等博主学了,会写博客的。

总结 

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

--结束END--

本文标题: java基础二叉搜索树图文详解

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

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

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

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

下载Word文档
猜你喜欢
  • java基础二叉搜索树图文详解
    目录概念直接实践准备工作:定义一个树节点的类,和二叉搜索树的类。搜索二叉树的查找功能搜索二叉树的插入操作搜索二叉树 删除节点的操作 - 难点性能分析总程序 - 模拟实现二叉搜索树和 ...
    99+
    2022-11-13
  • Java基础之二叉搜索树的基本操作
    目录一、二叉搜索树插入元素二、搜索指定节点三、删除节点方式一四、删除节点方式二五、运行结果一、二叉搜索树插入元素 class Node { int v...
    99+
    2022-11-12
  • Java中关于二叉树的概念以及搜索二叉树详解
    目录一、二叉树的概念为什么要使用二叉树?树是什么?树的相关术语!根节点路径父节点子节点叶节点子树访问层(深度)关键字满二叉树完全二叉树二叉树的五大性质二、搜索二叉树插入删除hello...
    99+
    2022-11-12
  • Java数据结构之二叉搜索树详解
    目录前言性质实现节点结构初始化插入节点查找节点删除节点最后前言 今天leetcode的每日一题450是关于删除二叉搜索树节点的,题目要求删除指定值的节点,并且需要保证二叉搜索树性质不...
    99+
    2022-11-13
  • C++二叉搜索树BSTree使用详解
    目录一、概念二、基础操作1.查找find2.插入Insert3.中序遍历InOrder4.删除erase三、递归写法1.递归查找2.递归插入3.递归删除四、应用五、题目练习一、概念 ...
    99+
    2023-03-09
    C++二叉搜索树BSTree C++二叉搜索树 C++ BSTree
  • C语言线索二叉树基础解读
    目录线索二叉树的意义线索二叉树的定义线索二叉树结构的实现二叉树的线索存储结构二叉树的中序线索化线索二叉树的中序遍历总结线索二叉树的意义 对于一个有n个节点的二叉树,每个节点有指向左右...
    99+
    2022-11-13
  • JavaScript二叉搜索树构建操作详解
    目录前言什么是二叉搜索树构建一颗二叉搜索树二叉搜索树的操作向二叉搜索树中插入数据查找二叉搜索树中的数据删除二叉搜索树的某个节点前驱后继节点删除一个节点的三种情况实现代码完整代码总结前...
    99+
    2022-11-13
  • 详解Java中二叉树的基础概念(递归&迭代)
    目录1.树型结构1.1概念1.2概念(重要)2.二叉树(重点)2.1概念2.2二叉树的基本形态2.3两种特殊的二叉树2.4二叉树的性质2.5二叉树的存储2.6二叉树的基本操作2.7二...
    99+
    2022-11-13
  • C++详解数据结构中的搜索二叉树
    目录定义查找某个元素构造搜索二叉树往搜索二叉树中插入元素搜索二叉树删除节点定义 搜索二叉树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: 1、若任意节点的左子树...
    99+
    2022-11-13
  • C语言实例实现二叉搜索树详解
    目录有些算法题里有了这个概念,因为不知道这是什么蒙圈了很久。 先序遍历: root——>left——>right 中序遍历...
    99+
    2022-11-13
  • Java数据结构超详细分析二叉搜索树
    目录1.搜索树的概念2.二叉搜索树的简单实现2.1查找2.2插入2.3删除2.4修改3.二叉搜索树的性能 1.搜索树的概念 二叉搜索树是一种特殊的二叉树,又称二叉查找树,二叉排序树,...
    99+
    2022-11-13
  • Java 求解如何把二叉搜索树转换为累加树
    一、题目 给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val ...
    99+
    2022-11-12
  • C++数据结构之二叉搜索树的实现详解
    目录前言介绍实现节点的实现二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除总结前言 今天我们来学一个新的数据结构:二叉搜索树。 介绍 二叉搜索树也称作二叉排序树,它具有以下性质: 非...
    99+
    2022-11-13
  • Java实现二叉树的基本操作详解
    目录1. 二叉树结点的构成2. 二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历3. 获取整棵二叉树的节点个数4. 获取二叉树叶子节点的个数5. 获取第K层节点的个数6....
    99+
    2022-11-13
    Java二叉树操作 Java二叉树
  • Java C++ 算法题解leetcode669修剪二叉搜索树示例
    目录题目要求思路一:模拟迭代JavaC++思路二:递归JavaC++Rust题目要求 思路一:模拟迭代 依次判断每个节点是否合法:首先找出结果的根,若原根小了就拉右边的过来,大了...
    99+
    2022-11-13
  • Java深入了解数据结构之二叉搜索树增插删创详解
    目录①概念②操作-查找③操作-插入④操作-删除1. cur.left == null2. cur.right == null3. cur.left != null &&...
    99+
    2022-11-13
  • Java动态规划方式解决不同的二叉搜索树
    目录一、题目描述二、思路三、代码一、题目描述 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 来...
    99+
    2022-11-13
    Java二叉搜索树 Java动态规划二叉搜索树 Java动态规划
  • C语言进阶二叉树的基础与销毁及层序遍历详解
    单值二叉树 难度简单 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回true;否则返回false。 示例 1: 输入:[1,1,...
    99+
    2022-11-13
  • Java Web项目基础图文详解
    一、Java Web 模块结构JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。Java Web和ASP.NET的核心是分别是Servlet和IHttpHandler接口,因此无论是基础的Page文件(JS...
    99+
    2022-01-21
    java基础 Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作