我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java数据结构之二叉搜索树实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java数据结构之二叉搜索树实例分析

这篇文章主要介绍“Java数据结构之二叉搜索树实例分析”,在日常操作中,相信很多人在Java数据结构之二叉搜索树实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之二叉搜索树实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    性质

    二叉搜索树或者是一棵空树,或者是具有下列性质的一棵二叉树,如果当前节点具有左子树,则左子树上的每一个节点值均小于等于当前节点值,如果当前节点具有右子树,则右子树上的每一个节点值均大于等于当前节点值。依据这个性质,当我们前序遍历二叉搜索树的时候,得到的序列应该是从小到大的非递减序列。同时搜索指定值时,只需要与当前节点比较,根据相对大小在左子树或者右子树上进行搜索。

    Java数据结构之二叉搜索树实例分析

    实现

    根据二叉搜索树的性质我们接下来需要实现插入节点,查询节点,删除节点功能。

    节点结构

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

    初始化

    这里我们假设所有节点值大于0,初始化一个头节点。ps:对于树,链表这类数据结构,为了使第一个节点操作与其他节点保持一致,方便操作,常见的方法是添加一个额外的头节点,指向第一个节点。

    TreeNode head;    private void init() {        //添加一个头节点        head = new TreeNode(-1);    }

    插入节点

    从头节点开始我们遍历二叉搜索树,如果当前节点值小于等于插入节点值,则插入节点在当前节点的右子树上,否则在左子树上,一直深度遍历知道当前节点的右子树(左子树)为空,则插入。

    Java数据结构之二叉搜索树实例分析

        public TreeNode insert(int val) {        TreeNode temp = head;        while (true) {            if (temp.val < val) {                //val应该在右子树上                if (null != temp.right) {                    temp = temp.right;                    continue;                } else {                    temp.right = new TreeNode(val);                    return temp.right;                }            }            //应该在左子树上            if (null != temp.left) {                temp = temp.left;                continue;            }            temp.left = new TreeNode(val);            return temp.left;        }    }

    查找节点

    查找节点的步骤其实在插入节点的时候已经有体现,其实就是将查找值与当前节点比较,大于当前节点走右子树,小于当前节点走左子树,直到值匹配返回节点,或者没有找到返回null。ps:这里为了后面方便实现删除,同时返回了当前节点以及当前节点的父节点,这里使用了commons-lang3包下的Pair工具。

    Java数据结构之二叉搜索树实例分析

        public Pair<TreeNode, TreeNode> find(int val) {        TreeNode temp = head.right;        TreeNode parent = head;        while (null != temp) {            if (temp.val == val) {                return Pair.of(temp, parent);            }            parent = temp;            if (temp.val < val) {                //在右子树上                temp = temp.right;                continue;            }            temp = temp.left;        }        return null;    }

    删除节点

    删除节点时候我们需要先找到删除节点的位置,然后做对应操作。有三种情况:

    如果删除的是叶子节点直接删除

    Java数据结构之二叉搜索树实例分析

    如果删除的节点只有左子树或者右子树,则直接将左子树或者右子树节点放在删除节点位置

    Java数据结构之二叉搜索树实例分析

    如果删除节点同时有左子树和右子树,则将右子树节点放在原来节点位置,将左子树放在右子树最左边节点左子树上(反之将左子树放在原来节点位置,右子树放在左子树最右边节点右子树上也可)

    Java数据结构之二叉搜索树实例分析

        public void delete(int val) {        //找到删除节点,删除节点父节点        Pair<TreeNode, TreeNode> curAndParent = this.find(val);        TreeNode cur = curAndParent.getLeft();        TreeNode parent = curAndParent.getRight();        //记录删除当前节点后,当前节点位置放置哪个节点        TreeNode changed;        if (null == cur.left && null == cur.right) {            changed = null;        } else if (null != cur.left && null != cur.right) {            TreeNode tempRight = cur.right;            while (null != tempRight.left) {                //找到最左侧节点                tempRight = tempRight.left;            }            tempRight.left = cur.left;            changed = cur.right;        } else if (null != cur.left) {            changed = cur.left;        } else {            changed = cur.right;        }        if (parent.left == cur) {            parent.left = changed;            return;        }        parent.right = changed;    }

    到此,关于“Java数据结构之二叉搜索树实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java数据结构之二叉搜索树实例分析

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

    下载Word文档

    猜你喜欢

    Java数据结构之二叉搜索树实例分析

    这篇文章主要介绍“Java数据结构之二叉搜索树实例分析”,在日常操作中,相信很多人在Java数据结构之二叉搜索树实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之二叉搜索树实例分析”的疑
    2023-06-30

    java二叉搜索树使用实例分析

    本篇内容主要讲解“java二叉搜索树使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java二叉搜索树使用实例分析”吧!概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性
    2023-06-29

    C++二叉搜索树实例分析

    本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer
    2023-06-19

    JavaScript二叉搜索树构建操作实例分析

    本篇内容介绍了“JavaScript二叉搜索树构建操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是二叉搜索树二叉搜索树首先它
    2023-07-02

    Java字符串,数组及二叉搜索树实例分析

    本文小编为大家详细介绍“Java字符串,数组及二叉搜索树实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java字符串,数组及二叉搜索树实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。题目一 解法c
    2023-06-29

    Java数据结构之线索化二叉树怎么实现

    这篇文章主要介绍“Java数据结构之线索化二叉树怎么实现”,在日常操作中,相信很多人在Java数据结构之线索化二叉树怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之线索化二叉树怎么实现
    2023-06-30

    Java数据结构之AVL树实例分析

    这篇文章主要介绍“Java数据结构之AVL树实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java数据结构之AVL树实例分析”文章能帮助大家解决问题。AVL树的引入搜索二叉树有着极高的搜索效
    2023-06-30

    Java二叉搜索树增、插、删、创的示例分析

    小编给大家分享一下Java二叉搜索树增、插、删、创的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!①概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有
    2023-06-29

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录