返回顶部
首页 > 资讯 > 精选 >Java二叉搜索树增、插、删、创的示例分析
  • 480
分享到

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

2023-06-29 00:06:33 480人浏览 独家记忆
摘要

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

小编给大家分享一下Java二叉搜索树增、插、删、创的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    ①概念

    二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:

    若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

    若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

    它的左右子树也分别为二叉搜索树

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

    ②操作-查找

    二叉搜索树的查找类似于二分法查找

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

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

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

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

    ③操作-插入

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

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

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

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

      public boolean insert(int key) {        Node node = new Node(key);        if(root == null) {            root = node;            return true;        }         Node cur = root;        Node parent = null;         while(cur != null) {            if(cur.val == key) {                return false;            }else if(cur.val < key) {                parent = cur;                cur = cur.right;            }else {                parent = cur;                cur = cur.left;            }        }        //parent        if(parent.val > key) {            parent.left = node;        }else {            parent.right = node;        }         return true;    }

    ④操作-删除

    删除操作较为复杂,但理解了其原理还是比较容易

    设待删除结点为 cur, 待删除结点的双亲结点为 parent

    1. cur.left == null

    cur 是 root,则 root = cur.right

    cur 不是 root,cur 是 parent.left,则 parent.left = cur.right

    cur 不是 root,cur 是 parent.right,则 parent.right = cur.right

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

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

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

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

    2. cur.right == null

    cur 是 root,则 root = cur.left

    cur 不是 root,cur 是 parent.left,则 parent.left = cur.left

    cur 不是 root,cur 是 parent.right,则 parent.right = cur.left

    第二种情况和第一种情况相同,只是方向相反,这里不再画图

    3. cur.left != null && cur.right != null

    需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题

    当我们在左右子树都不为空的情况下进行删除,删除该节点会破坏树的结构,因此用替罪羊的方法来解决,实际删除的过程还是上面的两种情况,这里还是用到了搜索二叉树的性质

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

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

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

    public void remove(Node parent,Node cur) {        if(cur.left == null) {            if(cur == root) {                root = cur.right;            }else if(cur == parent.left) {                parent.left = cur.right;            }else {                parent.right = cur.right;            }        }else if(cur.right == null) {            if(cur == root) {                root = cur.left;            }else if(cur == parent.left) {                parent.left = cur.left;            }else {                parent.right = cur.left;            }        }else {            Node targetParent =  cur;            Node target = cur.right;            while (target.left != null) {                targetParent = target;                target = target.left;            }            cur.val = target.val;            if(target == targetParent.left) {                targetParent.left = target.right;            }else {                targetParent.right = target.right;            }        }    }   public void removeKey(int key) {        if(root == null) {            return;        }        Node cur = root;        Node parent = null;        while (cur != null) {            if(cur.val == key) {                remove(parent,cur);                return;            }else if(cur.val < key){                parent = cur;                cur = cur.right;            }else {                parent = cur;                cur = cur.left;            }        }    }

    ⑤性能分析

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

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

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

    最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:

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

    最差情况下,二叉搜索树退化为单支树,其平均比较次数为:

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

    ⑥完整代码

    public class TextDemo {     public static class Node {        public int val;        public Node left;        public Node right;         public Node (int val) {            this.val = val;        }    }      public Node root;         public Node search(int key) {        Node cur = 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) {        Node node = new Node(key);        if(root == null) {            root = node;            return true;        }         Node cur = root;        Node parent = null;         while(cur != null) {            if(cur.val == key) {                return false;            }else if(cur.val < key) {                parent = cur;                cur = cur.right;            }else {                parent = cur;                cur = cur.left;            }        }        //parent        if(parent.val > key) {            parent.left = node;        }else {            parent.right = node;        }         return true;    }     public void remove(Node parent,Node cur) {        if(cur.left == null) {            if(cur == root) {                root = cur.right;            }else if(cur == parent.left) {                parent.left = cur.right;            }else {                parent.right = cur.right;            }        }else if(cur.right == null) {            if(cur == root) {                root = cur.left;            }else if(cur == parent.left) {                parent.left = cur.left;            }else {                parent.right = cur.left;            }        }else {            Node targetParent =  cur;            Node target = cur.right;            while (target.left != null) {                targetParent = target;                target = target.left;            }            cur.val = target.val;            if(target == targetParent.left) {                targetParent.left = target.right;            }else {                targetParent.right = target.right;            }        }    }     public void removeKey(int key) {        if(root == null) {            return;        }        Node cur = root;        Node parent = null;        while (cur != null) {            if(cur.val == key) {                remove(parent,cur);                return;            }else if(cur.val < key){                parent = cur;                cur = cur.right;            }else {                parent = cur;                cur = cur.left;            }        }    } }

    看完了这篇文章,相信你对“Java二叉搜索树增、插、删、创的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: Java二叉搜索树增、插、删、创的示例分析

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

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

    猜你喜欢
    • Java二叉搜索树增、插、删、创的示例分析
      小编给大家分享一下Java二叉搜索树增、插、删、创的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!①概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有...
      99+
      2023-06-29
    • Java创建二叉搜索树,实现搜索,插入,删除的操作实例
      Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除)首先我们要有一个编码的思路,大致如下: 1、查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查找值大于当前节点时向右走,反之向左走!2、...
      99+
      2023-05-30
      java 二叉搜索树 搜索
    • java二叉搜索树使用实例分析
      本篇内容主要讲解“java二叉搜索树使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java二叉搜索树使用实例分析”吧!概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性...
      99+
      2023-06-29
    • C++二叉搜索树实例分析
      本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer&...
      99+
      2023-06-19
    • Java深入了解数据结构之二叉搜索树增插删创详解
      目录①概念②操作-查找③操作-插入④操作-删除1. cur.left == null2. cur.right == null3. cur.left != null &&...
      99+
      2024-04-02
    • Java实现二叉搜索树的插入、删除功能
      二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode rig...
      99+
      2024-04-02
    • Java中二叉树与N叉树的示例分析
      这篇文章主要介绍了Java中二叉树与N叉树的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目一 解法class Solution {&...
      99+
      2023-06-29
    • C++使用LeetCode实现二叉搜索树的示例分析
      这篇文章将为大家详细讲解有关C++使用LeetCode实现二叉搜索树的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Given an integer n, generate all st...
      99+
      2023-06-20
    • Java数据结构之二叉搜索树实例分析
      这篇文章主要介绍“Java数据结构之二叉搜索树实例分析”,在日常操作中,相信很多人在Java数据结构之二叉搜索树实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之二叉搜索树实例分析”的疑...
      99+
      2023-06-30
    • Java怎么实现二叉搜索树的插入、删除功能
      这篇文章给大家介绍Java怎么实现二叉搜索树的插入、删除功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的特点有哪些Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允...
      99+
      2023-06-26
    • Java字符串,数组及二叉搜索树实例分析
      本文小编为大家详细介绍“Java字符串,数组及二叉搜索树实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java字符串,数组及二叉搜索树实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。题目一&nbs...
      99+
      2023-06-29
    • java二叉树中数据插入算法的示例分析
      这篇文章主要介绍java二叉树中数据插入算法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!例题:leetcode 第701题二叉树插入数据题目:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉...
      99+
      2023-06-22
    • JavaScript二叉搜索树构建操作实例分析
      本篇内容介绍了“JavaScript二叉搜索树构建操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是二叉搜索树二叉搜索树首先它...
      99+
      2023-07-02
    • C++LeetCode0538二叉搜索树转换累加树示例
      目录LeetCode 538把二叉搜索树转换为累加树方法一:DFS反向中序遍历AC代码C++LeetCode 538把二叉搜索树转换为累加树 力扣题目链接:lee...
      99+
      2022-12-16
      C++ 二叉搜索树转换累加树 C++ LeetCode
    • java二叉树面试题的示例分析
      小编给大家分享一下java二叉树面试题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!二叉树的深度题目:输入一颗二叉树的根节点,求该树的的深度。输入一颗二...
      99+
      2023-06-20
    • Java数据结构超详细分析二叉搜索树
      目录1.搜索树的概念2.二叉搜索树的简单实现2.1查找2.2插入2.3删除2.4修改3.二叉搜索树的性能 1.搜索树的概念 二叉搜索树是一种特殊的二叉树,又称二叉查找树,二叉排序树,...
      99+
      2024-04-02
    • 镜像二叉树的示例分析
      镜像二叉树的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。算法这个东西很难,纵使你了解了其中的逻辑,用代码写出来仍然不是一件容易的事,内部有太多的细节需...
      99+
      2023-06-04
    • Java实现二分搜索树的示例代码
      目录1.概念2.重点操作3.完整代码1.概念 a.是个二叉树(每个节点最多有两个子节点) b.对于这棵树中的节点的节点值 左子树中的所有节点值 < 根节点 < 右子树的所...
      99+
      2024-04-02
    • Java C++ 算法题解leetcode669修剪二叉搜索树示例
      目录题目要求思路一:模拟迭代JavaC++思路二:递归JavaC++Rust题目要求 思路一:模拟迭代 依次判断每个节点是否合法:首先找出结果的根,若原根小了就拉右边的过来,大了...
      99+
      2024-04-02
    • Java中关于二叉树的概念以及搜索二叉树详解
      目录一、二叉树的概念为什么要使用二叉树?树是什么?树的相关术语!根节点路径父节点子节点叶节点子树访问层(深度)关键字满二叉树完全二叉树二叉树的五大性质二、搜索二叉树插入删除hello...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作