广告
返回顶部
首页 > 资讯 > 精选 >Java排序二叉树怎么定义
  • 212
分享到

Java排序二叉树怎么定义

2023-06-30 18:06:03 212人浏览 独家记忆
摘要

这篇文章主要介绍了Java排序二叉树怎么定义的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java排序二叉树怎么定义文章都会有所收获,下面我们一起来看看吧。排序二叉树概念二叉排序树(Binary Sort Tr

这篇文章主要介绍了Java排序二叉树怎么定义的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java排序二叉树怎么定义文章都会有所收获,下面我们一起来看看吧。

排序二叉树概念

  • 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。

  • 对于二叉排序树的任何一个非叶子节点, 要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。

  • 对二叉排序树进行中序遍历,结果就是按从小到大排序的。

排序二叉树类的定义

public class binarySortTree {    class node{        int value;        Node left;        Node right;        public Node(int value){            this.value = value;        }        public void display(){            System.out.print(this.value + " ");        }    }    Node root;}

添加节点

排序二叉树添加节点的十分简单,无论使用递归还是循环,思路都一样,这里我用递归的方式讲解。

  1. 每次添加一个节点时,判断value(添加节点的值)与root的值的大小关系: 若root.value < value, 说明该节点应该添加在root的右子树上。如果右子树为空,直接添加:root.right = new Node(value);如果右子树不为空,那么递归进右子树(令root.right为root)。

  2. root.value >= value, 说明该节点应该添加在root的左子树上。如果左子树为空,直接添加:root.left = new Node(value);如果左子树不为空,那么递归进右子树(令root.left为root)。

代码如下:

//添加节点//此方法可以类内部方法的调用    private void add(Node root,int value){        //添加节点的值大于根节点的值,该节点添加到根节点的右子树上        if(value > root.value){            //根节点的右子树为空,直接添加            if(root.right == null){                root.right = new Node(value);            }            //根节点右子树不为空,递归往右子树插            else{                add(root.right,value);            }        }        //添加节点的值小于或者等于根节点的值,该节点应该添加到左子树        else{            //左子树为空,直接添加            if(root.left == null){                root.left = new Node(value);            }            //左子树不为空,递归往左子树添加            else{                add(root.left, value);            }        }    }    //此方法在类内部和类外部都可以调用    public void add(int value){        //当前树为空树        if(root == null){            root = new Node(value);            return;        }        add(root, value);    }

中序遍历

因为二叉排序树中序遍历的结果就是排序好的,所以这里只提供中序遍历。

代码如下:

//中序遍历树    private  void inPrevOrder(Node root){        if(root == null) return;        inPrevOrder(root.left);        root.display();        inPrevOrder(root.right);    }    public void inPrevOrder(){        System.out.print("中序遍历:");        inPrevOrder(root);    }

查找节点

该方法是查找value在二叉树中对应的位置,是为删除节点提供的方法。

    private Node searchNode(Node root, int value){        //被查找树为null,要查找节点不存在        if(root == null)            return null;        //找到了,返回节点        else if(root.value == value){            return root;        }        //该节点不是要查找节点,继续查找        else{            //该节点的值大于value,往该节点的左子树递归查找            if(root.value > value){                return searchNode(root.left, value);            }            //该节点的值小于value,往该节点的右子树递归查找            else{                return searchNode(root.right, value);            }        }    }

查找某一节点的父节点

该方法是查找二叉树中一个节点的父节点,也是为删除节点提供的方法。

     private Node searchParentNode(Node root, Node node){        //被查找树为null或者根节点就是要查找的节点,那么要查找节点的父节点不存在        if(root == null || root == node){            return null;        }        else if(root.left != null && root.left == node || root.right != null && root.right == node){            return root;        }        else{            if(root.value > node.value){                return searchParentNode(root.left, node);            }            else{                return searchParentNode(root.right, node);            }        }    }

删除节点

删除节点是排序二叉树中最麻烦的方法,因为它有很多种情况。

方法如下:

   第一种情况:删除的节点是叶子节点
(1)需求先去找到要删除的结点targetNode

(2)找到targetNode的父结点parent

(3)确定targetNode是parent的左子结点还是右子结点
   3.1如果targetNode是parent的左子结点:parent.left = null;
   3.2如果targetNode是parent的右子结点:parent.right = null;
   第二种情况:删除只有一颗子树的节点
(1)需求先去找到要删除的结点targetNode

(2)找到targetNode的父结点parent

(3)确定targetNode的子结点是左子结点还是右子结点

(4)确定targetNode是parent的左子结点还是右子结点

(5)如果targetNode有左子结点
   5.1如果targetNode是parent的左子结点parent.left = targetNode.left;
   5.2如果targetNode是parent的右子结点parent.right = targetNode.left;
(6)如果targetNode有右子结点
   6.1如果targetNode是 parent 的左子结点parent.left = targetNode.right;
   6.2如果targetNode是parent 的右子结点parent.right = targetNode.right
    第三种情况:删除的节点有左右两个子树
(1)需求先去找到要删除的结点targetNode

(2)在右子树找到最小的节点,用一个temp保存这个节点的值,然后删除这个最小节点(该最小节点一定是满足第一种情况的)

(3)targetNode.value = temp

除了以上情况,还要考虑要删除的节点就是根节点的情况(此时它的父节点为null),下面会在代码中展示,代码如下:

public void remove(int vlaue){        //找到要删除的节点        Node targetNode = searchNode(root,vlaue);        //要删除节点不存在        if(targetNode == null) return;        //找到要删除节点的父节点        Node targetNodeParent = searchParentNode(root,targetNode);        //要删除节点为叶子节点        if(targetNode.left == null && targetNode.right == null){            //要删除的节点就是根节点            if(targetNodeParent == null){              root = null;            }            else{                //要删除节点是其父节点的左节点                if(targetNodeParent.left == targetNode){                    targetNodeParent.left = null;                }                else{                    targetNodeParent.right = null;                }            }        }        //要删除节点只有一个左子树        else if(targetNode.left != null && targetNode.right == null){            //要删除的节点就是根节点            if(targetNodeParent == null) {                root = root.left;            }            //要删除节点是其父节点的左节点            else if(targetNodeParent.left != null && targetNodeParent.left.value == targetNode.value){                targetNodeParent.left = targetNode.left;            }            //要删除节点是其父节点的右节点            else{                targetNodeParent.right = targetNode.left;            }        }        //要删除节点只有一个右子树        else if(targetNode.right != null && targetNode.left == null){            //要删除的节点就是根节点            if(targetNodeParent == null) {                root = root.right;                return;            }            //要删除节点是其父节点的左节点            else if(targetNodeParent.left != null && targetNodeParent.left.value == targetNode.value){                targetNodeParent.left = targetNode.right;            }            //要删除节点是其父节点的右节点            else{                targetNodeParent.right = targetNode.right;            }        }        //要删除节点右左右都有节点        else{            //找到右子树最小的节点            Node minNode = targetNode.right;            while(minNode.left != null){                minNode = minNode.left;            }            int temp = minNode.value;            //找到右子树上最小节点的父节点            Node minNodeParent = searchParentNode(targetNode.right,minNode);            //右子树根节点就是最小节点            if(minNodeParent == null){                targetNode.right = minNode.right;            }            else{                //要删除节点是其父节点的左节点                minNodeParent.left = minNode.right;            }            targetNode.value = temp;        }    }

关于“Java排序二叉树怎么定义”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java排序二叉树怎么定义”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java排序二叉树怎么定义

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

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

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

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

下载Word文档
猜你喜欢
  • Java排序二叉树怎么定义
    这篇文章主要介绍了Java排序二叉树怎么定义的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java排序二叉树怎么定义文章都会有所收获,下面我们一起来看看吧。排序二叉树概念二叉排序树(Binary Sort Tr...
    99+
    2023-06-30
  • Java如何实现二叉排序树
    这篇文章给大家分享的是有关Java如何实现二叉排序树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 二叉排序树的概述对于常见查找算法,比如顺序查找、二分查找、插入查找、斐波那契查找还不清楚的,可以看这篇文章:常...
    99+
    2023-06-28
  • Java超详细讲解排序二叉树
    目录排序二叉树概念排序二叉树类的定义添加节点中序遍历查找节点查找某一节点的父节点删除节点排序二叉树概念 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary ...
    99+
    2022-11-13
  • 最小二叉树堆排序怎么利用java 实现
    这篇文章给大家介绍最小二叉树堆排序怎么利用java 实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。最小二叉堆定义: 二叉堆是完全二元树或者是近似完全二元树,最小二叉堆是父结点的键值总是小于或等于任何一个子...
    99+
    2023-05-31
    java ava
  • Java数据结构之二叉排序树的实现
    目录1 二叉排序树的概述2 二叉排序树的构建2.1 类架构2.2 查找的方法2.3 插入的方法2.4 查找最大值和最小值2.5 删除的方法3 二叉排序树的总结1 二叉排序树的概述 本...
    99+
    2022-11-13
  • Python数据结构之二叉排序树的定义、查找、插入、构造、删除
    前言   本篇章主要介绍二叉树的应用之一------二叉排序树,包括二叉排序树的定义、查找、插入、构造、删除及查找效率分析。 1. 二叉排序树的定义 Q...
    99+
    2022-11-12
  • Java平衡二叉树怎么实现
    本篇内容主要讲解“Java平衡二叉树怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java平衡二叉树怎么实现”吧!什么是二叉搜索树简单来说,就是方便搜索的二叉树,是一种具备特定结构的二叉...
    99+
    2023-06-29
  • Python中如何实现二叉排序树的定义、查找、插入、构造、删除操作
    这篇文章将为大家详细讲解有关Python中如何实现二叉排序树的定义、查找、插入、构造、删除操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 二叉排序树的定义  二叉排序树 ( B i n a r y...
    99+
    2023-06-15
  • 怎么在Java中利用二叉查找树算法实现一个排序功能
    这期内容当中小编将会给大家带来有关怎么在Java中利用二叉查找树算法实现一个排序功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:public class BinaryNode<T ext...
    99+
    2023-05-31
    java 二叉查找树 排序
  • C++怎么实现二叉树层序遍历
    本篇内容主要讲解“C++怎么实现二叉树层序遍历”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现二叉树层序遍历”吧!二叉树层序遍历Given a binary tree, return...
    99+
    2023-06-20
  • Java实现二叉树的代码怎么写
    本篇内容主要讲解“Java实现二叉树的代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java实现二叉树的代码怎么写”吧!以此图为例,完整代码如下://基础二叉树实现//使用左右孩子表示...
    99+
    2023-06-29
  • 怎么解析python二叉树的中序遍历
    今天就跟大家聊聊有关怎么解析python二叉树的中序遍历,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。二叉树的中序遍历题目给定一个二叉树,返回它的 中序 遍历。示例:输入: [1,n...
    99+
    2023-06-19
  • 怎么解析python二叉树的后序遍历
    怎么解析python二叉树的后序遍历,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。二叉树的后序遍历题目给定一个二叉树,返回它的 后序 遍历。 示例:输入: [1,...
    99+
    2023-06-19
  • C++怎么实现二叉树的后序遍历
    这篇文章主要介绍“C++怎么实现二叉树的后序遍历”,在日常操作中,相信很多人在C++怎么实现二叉树的后序遍历问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现二叉树的后序遍历”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • java怎么实现二叉树的层次遍历
    这篇文章主要介绍“java怎么实现二叉树的层次遍历”,在日常操作中,相信很多人在java怎么实现二叉树的层次遍历问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么实现二叉树的层次遍历”的疑惑有所帮助!...
    99+
    2023-06-19
  • 怎么理解并掌握Java二叉查找树
    本篇内容主要讲解“怎么理解并掌握Java二叉查找树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握Java二叉查找树”吧!一、介绍二叉查找树,英文全...
    99+
    2022-10-19
  • C++怎么实现由先序和中序遍历二叉树
    这篇文章主要介绍了C++怎么实现由先序和中序遍历二叉树的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现由先序和中序遍历二叉树文章都会有所收获,下面我们一起来看看吧。由先序和中序遍历建立二叉树Give...
    99+
    2023-06-19
  • Java怎么找二叉树的最近公共祖先
    本篇内容主要讲解“Java怎么找二叉树的最近公共祖先”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么找二叉树的最近公共祖先”吧!思路一:先假设这棵树是二叉搜索树首先我们补充说明一下什么...
    99+
    2023-06-30
  • Java怎么实现二叉查找树的增删查
    本篇内容介绍了“Java怎么实现二叉查找树的增删查”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!定义二叉查找树(ADT)是一个具有对于树种的...
    99+
    2023-07-02
  • 怎么在Java中实现一个二叉树路径
    这篇文章给大家介绍怎么在Java中实现一个二叉树路径,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。给定一个二叉树,和 目标值 = 5:  1 / \ 2 4&...
    99+
    2023-05-30
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作