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

Java排序二叉树怎么定义

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Java排序二叉树怎么定义

这篇文章主要介绍了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排序二叉树怎么定义”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

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

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

Java排序二叉树怎么定义

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

下载Word文档

猜你喜欢

Java排序二叉树怎么定义

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

Java如何实现二叉排序树

这篇文章给大家分享的是有关Java如何实现二叉排序树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 二叉排序树的概述对于常见查找算法,比如顺序查找、二分查找、插入查找、斐波那契查找还不清楚的,可以看这篇文章:常
2023-06-28

最小二叉树堆排序怎么利用java 实现

这篇文章给大家介绍最小二叉树堆排序怎么利用java 实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。最小二叉堆定义: 二叉堆是完全二元树或者是近似完全二元树,最小二叉堆是父结点的键值总是小于或等于任何一个子节点的键值
2023-05-31

java二叉树层序遍历怎么实现

在Java中,可以使用队列来实现二叉树的层序遍历。具体步骤如下:首先创建一个队列,将根节点入队。进入循环,直到队列为空为止。在循环中,首先记录当前队列的大小,表示当前层的节点个数。遍历当前层的节点个数次,每次将队头节点出队,并将其值存入结果
java二叉树层序遍历怎么实现
2024-03-15

Java平衡二叉树怎么实现

本篇内容主要讲解“Java平衡二叉树怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java平衡二叉树怎么实现”吧!什么是二叉搜索树简单来说,就是方便搜索的二叉树,是一种具备特定结构的二叉
2023-06-29

Python中如何实现二叉排序树的定义、查找、插入、构造、删除操作

这篇文章将为大家详细讲解有关Python中如何实现二叉排序树的定义、查找、插入、构造、删除操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 二叉排序树的定义  二叉排序树 ( B i n a r y
2023-06-15

C++怎么实现二叉树层序遍历

本篇内容主要讲解“C++怎么实现二叉树层序遍历”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现二叉树层序遍历”吧!二叉树层序遍历Given a binary tree, return
2023-06-20

怎么在Java中利用二叉查找树算法实现一个排序功能

这期内容当中小编将会给大家带来有关怎么在Java中利用二叉查找树算法实现一个排序功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:/** * 无论排序的对象是什么,都要实现Comparable接
2023-05-31

怎么解析python二叉树的后序遍历

怎么解析python二叉树的后序遍历,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。二叉树的后序遍历题目给定一个二叉树,返回它的 后序 遍历。 示例:输入: [1,null,
2023-06-19

C++怎么实现二叉树的后序遍历

这篇文章主要介绍“C++怎么实现二叉树的后序遍历”,在日常操作中,相信很多人在C++怎么实现二叉树的后序遍历问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现二叉树的后序遍历”的疑惑有所帮助!接下来
2023-06-20

Java实现二叉树的代码怎么写

本篇内容主要讲解“Java实现二叉树的代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java实现二叉树的代码怎么写”吧!以此图为例,完整代码如下://基础二叉树实现//使用左右孩子表示
2023-06-29

怎么解析python二叉树的中序遍历

今天就跟大家聊聊有关怎么解析python二叉树的中序遍历,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。二叉树的中序遍历题目给定一个二叉树,返回它的 中序 遍历。示例:输入: [1,n
2023-06-19

java怎么实现二叉树的层次遍历

这篇文章主要介绍“java怎么实现二叉树的层次遍历”,在日常操作中,相信很多人在java怎么实现二叉树的层次遍历问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么实现二叉树的层次遍历”的疑惑有所帮助!
2023-06-19

C++怎么实现由先序和中序遍历二叉树

这篇文章主要介绍了C++怎么实现由先序和中序遍历二叉树的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现由先序和中序遍历二叉树文章都会有所收获,下面我们一起来看看吧。由先序和中序遍历建立二叉树Give
2023-06-19

Java怎么实现二叉查找树的增删查

本篇内容介绍了“Java怎么实现二叉查找树的增删查”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!定义二叉查找树(ADT)是一个具有对于树种的
2023-07-02

C++二叉树的前序中序后序非递归怎么实现

这篇“C++二叉树的前序中序后序非递归怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++二叉树的前序中序后序非递归
2023-07-05

编程热搜

  • 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动态编译

目录