JAVA数据结构——二叉树

Java数据结构之树和二叉树 现在开始学习新的数据结构–树(树形结构) 它是重要的非线性数据结构,区别之前学习的链表和栈者(这些是一对一的线性结构),树是一对多结构。 从定义开始: 树(Tree)是n(n>=0)个节点的有限集合。 在任意一棵非空树中有 有且只有一个特定的节点称为根(Root) 当n大于1的时候,其余节点可以分为m(m>0)个互不相交的有限集合T1,T2,T3,… Tm;其中每个集合本身又可以是一棵树,称为子树。 有关树(Tree)的的相关术语: 节点(Node):包一个数据元素以及指向其他子树的指针(分 阅读详情

JAVA数据结构

Java数据结构(2)——二叉树

1.二叉树

树是一种典型的数据结构,具有很多重要的应用。树提供了一种层次组织结构,数据可以存储在树中每个节点内。前文所提到的线性表,其结构是线性的。而二叉树是一种层次结构,它要么是空集,要么是由一个称为根(root)的元素和两棵不同的二叉树组成,这两棵二叉树分别称为左子树和右子树。定义中允许这两科树中的一颗或者两棵为空。下面是一些关于二叉树的基本概念:

  • 长度:指在该条路径上的边的个数。
  • 深度:指从根节点到该节点的路径长度。
  • 左(右)孩子结点:一个结点的左(右)子树的根节点称为这个结点的左(右)孩子。
  • 叶节点:没有左右孩子结点的结点。

本文将以一种特殊类型的二叉树——二叉查找树来对二叉树这种数据结构进行分析。二叉查找树的特征是:对于树中的每一个结点,它的左子树中的结点的值都小于该结点的值,而它的右子树中结点的值都大于该节点的值,二叉查找树中没有重复的元素。

1.1 二叉查找树

二叉查找树可以使用链式结构来表示,同理数据结构(1)中所提到的链表,二叉查找树的结点类型与之相仿,每个结点类型都包含了一个数值和两个结点类型left、right分别指向左孩子和右孩子,具体结点类表示代码如下。

class TreeNode<E extends Comparable<E>>{
  E element;
  TreeNode left;
  TreeNode right;
  public TreeNode(E e){
    element=e;
  }
}

在定义二叉树时,变量root指向树的根节点。若树为空,那么root的值为null。那么我们创建一个简单的具有5,8,,10这三个值的二叉树如下所示。

TreeNode<Integer> root=new TreeNode<Integer>(new Integer(8)); //头结点
TreeNode<Integer> left=new TreeNode<Integer>(new Integer(5)); //左子树
TreeNode<Integer> right=new TreeNode<Integer>(new Integer(10)); //右子树
1.2 查找元素

要在二叉查找树中查找一个元素,可以从根节点开始向下扫描,直到找到一个匹配元素或者达到一课空子树(树中并无匹配数据)。查找算法主要利用了二叉查找树的特性,即

对于树中的每一个结点,它的左子树中的结点的值都小于该结点的值,而它的右子树中结点的值都大于该节点的值,二叉查找树中没有重复的元素。

根据前文创建的结点类泛型类型,结点中的值是Comparable的子类,能够使用比较器进行比较。在构建二叉树时的插入算法,也将运用Comparable中的方法进行元素的比较。具体算法如下:

public boolean search(E element){
  TreeNode<E> current=root;//令根结点为当前结点
  while(current!=null){
    if(element.compareTo(current.element)<0){//利用比较器比较元素
      current=current.left;
    }else if(element.compareTo(current.element)>0){
      current=current.right;
    }else return true;//树中存在查找元素
  }
  return false;//树中不存在查找元素
}
1.3 插入元素

在二叉查找树(Binary Serach Tree)中插入一个元素,主要分为两个步骤,先确定插入元素在树中的具体插入位置,然后再插入元素。确定具体插入位置的关键在于确定新节点的父结点的位置。具体算法如下所示。

public boolean insert(E e){
  if(root==null)
    root=new TreeNode<E>(e);//树为空则创建头结点
  else{
    TreeNode<E> current=root;//当前结点指针
    TreeNdoe<E> parent=null;//父结点指针
    while(current!=null)
      if(e.compareTo(current.element)<0){
        parent=current;
        current=current.left;
      }else if(e.compareTo(current.element)>0){
        parent=current;
        current=current.right;
      }
  }
}

上述算法表示,若这棵树是空的就创建一个根结点;否则寻找新元素节点的父结点的位置。寻找方法则是不断比较插入元素与树中元素的大小,若新元素的值小于父元素的值,则将新元素的结点设置为父结点的左孩子;若新元素的值大于父元素的值,则将心愿素的结点设置为父结点的右孩子。

1.4 树的遍历

树的遍历就是访问树中每个结点一次且仅一次的过程。遍历的方法有很多种,一般通过迭代的方法能够容易实现,下面代码展示了各遍历方法是如何实现的。常用的遍历方法有如下5个:

  • 中序遍历:首先递归地访问当前结点的左子树,然后访问当前结点,最后递归地访问该节点的右子树。该遍历方法按照递增顺序显示二叉查找树中的所有结点。
  • 前序遍历:首先访问当前结点,然后递归地访问该节点的左子树,最后递归地访问该节点的右子树。
  • 后序遍历:首先递归地访问当前结点的左子树,然后递归地访问该节点的右子树,最后访问该节点本身。
  • 深度优先:遍历方法与前序遍历方法相同。
  • 广度优先:逐层访问树中的节点,首先访问根结点,然后从左至右访问根结点所有的孩子,再从左往右访问根结点所有的孙子节点,以此类推。

  • 中序遍历方法
public void inOrder(TreeNode<E> root){
  if(root==null) return;
  inOrder(root.left);//先遍历左子树,首先打印"最左"的叶子结点的值,然后打印其父结点的值
  System.out.println(root.element+" ");
  inOrder(root.right);//遍历右子树,同样按照左子树——根结点——右子树的顺序依次打印
}

  • 前序遍历方法
public void preOrder(TreeNode<E> root){
  if(root==null) return;
  System.out.println(root.element+" ");
  preOrder(root.left);
  preOrder(root.right);
}

  • 后序遍历方法
public void postOrder(TreeNode<E> root){
  if(root==null) return;
  postOrder(root.left);
  postOrder(root.right);
  System.out.println(root.element+" ");
}
1.5 删除元素

在二叉树种删除一个元素,比向二叉树中添加一个元素复杂很多。二叉树由于是层状结构,一旦某个结点被删除,整棵树可能都要进行重新构建。为了从一棵二叉查找树中删除一个元素,首先需要定位包含该元素的结点,以及它的父结点。假设current指向二叉查找书中包含删除元素的结点,parent指向current结点的父结点。current结点可能是parent结点的左孩子,也有可能是右孩子,这里需要分两种情况进行考虑:

  • 情况一
    当前结点(current)没有左孩子。这时只需要把该节点的父结点和当前结点的右孩子相连即可。

  • 情况二
    当前结点(current)有一个左孩子。此时我们需要定义变量rightMost,用来表示current结点的左子树中具有最大元素的结点。变量parentOfRightMost指向rightMost结点的父结点。其中,rightMost结点由于已经是current左子树中具有最大元素的结点,在二叉查找树中,这样的结点是不存在右孩子的,但可以存在左孩子。
    然后使用rightMost结点中的元素替换current结点中的元素值,将parentOfrightMost结点和rightMost结点的左孩子相连,然后删除rightMost结点。

二叉查找树删除方法代码实现如下所示:

public boolean delete(E e){
  TreeNode<E> parent=null;
  TreeNode<E> current=root;

  /*定位需要删除节点的位置*/
  while(current!=null){
    if(e.compareTo(current.element)<0){
      parent=current;
      current=current.left;
    }else if(e.compareTo(current.element)>0){
      parent=current;
      current=current.right;
    }else break;
}
  if(current==null) return false;

  /*第一种情况,当前结点没有左孩子*/
  if(current.left==null){
    if(parent==null){
      root=current.right;
    }else{
      if(e.compareTo(parent.element)<0)
        parent.left=current.right;
      else
        parent.right=current.right;
    }
  }else{
  /*第二种情况,当前结点有左孩子*/

    TreeNode<E> parentOfrightMost=current;
    TreeNode<E> rightMost=current.left;
    /*定义新变量,查找左子树中具有最大值元素的位置*/

    while(rightMost.right!=null){
      parentOfrightMost=rightMost;
      rightMost=rightMost.right;
    }

    current.element=rightMost.element;//将当前结点左子树下最大元素值赋值给当前结点
    if(parentOfrightMost.right==rightMost)
      parentOfrightMost.right=rightMost.left;
    else
      parentOfrightMost.left=rightMost.left;
  }
  return ture;
}
1.6 构造二叉查找树

Java集合框架API的设计模式遵循接口——抽象类——扩展类的顺序,这里我们仿照这种模式构造二叉树类。使用一个名为Tree的接口来定义树的所有常用操作,并提供名为AbstractTree的抽象类,该抽象类部分实现了Tree接口,扩展这个抽象类定义了一个具体的BinaryTree类。其中包含的方法如下。

  • Tree
方法名作用
boolean search(E e)搜索元素,成功则返回true
boolean insert(E e)插入元素,成功则返回true
boolean delete(E e)删除元素,成功则返回true
void inOrder()中序遍历二叉树
void preOrder()前序遍历二叉树
void postOrder()后序遍历二叉树
boolean isEmpty()如果树为空则返回true

  • BinaryTree
方法名作用
TreeNode root根结点
public BinaryTree()构造函数
public BinaryTree(E[] objects)由一个元素数组创建二叉树

具体实现代码如下:

public interface Tree<E extends Comparable<E>>{
  /*包括上述表格中接口的函数*/
}

public class BinaryTree<E extends Comparable<E>> implements Tree<E>{
  protected TreeNode<E> root;
  public BinaryTree(){}
  public BinaryTree(E[] objects){
    for(int i=0;i<objects.length;i++)
      insert(objects[i]);
  }
  /*下列函数详见前文*/
  public boolean insert(E e){}
  boolean insert(E e){}
  boolean delete(E e){}
  void inOrder(){}
  void preOrder(){}
  void postOrder(){}
  boolean isEmpty(){}
}
1.7小结

BST是一种分层的数据结构,本文主要简介了如何定义和实现BST类,并实现了搜索、插入、删除以及一系列遍历方法。

数据结构与算法——二叉树详解java 我们有序数组查找快,可以通过二分查找快速的查找到数据,但是要在有序数组中插入一个数的话,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项后移以为,给新的数据腾出空间,同时删除数据也是一样的道理,可以知道这样的话是很浪费时间的, 同时另外的一种数据结构——链表,链表的插入和删除很快,我们只需要改变一些引用,但是查找数据就会很慢,因为我们无论查找到什么数据,都需要从链表的第一个数据开始,遍... 阅读详情

相关推荐

Windows系统下AutoDock 4.2.6安装避坑指南(附MGLTools配置技巧)

本文详细介绍了在Windows系统下安装和配置AutoDock 4.2.6的完整流程,特别针对分子对接研究中常见的软件安装问题提供了解决方案。从环境准备、分步安装到常见报错处理,涵盖MGLTools配置技巧、工作目录设置和环境变量优化,帮助科研人员快速搭建稳定的分子对接平台。

weixin_29234239的博客 313

数据结构——树

前言:很多高级的数据结构通常都是对常用数据结构增加限制而来。 树作为重要的数据结构之一,经常出现在很多算法题的应用中。本文将介绍基础的树理论及其延伸出的数据结构。话不多说,直接上图。 图1 二叉树家族 我们顺着图1的箭头,从上至下,从左到右依次看。 单链表 链表由多个节点组成,在经典的单链表结构中,每个节点都其相应的前驱节点和后继节点(例外:头节点只有后继节点;尾结点只有前驱节点)单链表的结构如图2所示。 图2 单链表 如图2所示,单链表中的每个节点存储有节点值和指向后继节点的Nex..

zzt123zq的博客 295

uniapp+openlayers集成天地图实战:renderjs通信陷阱与性能优化避坑指南

本文深入探讨了uniapp与openlayers集成天地图时的renderjs通信陷阱与性能优化策略。通过实战案例解析了renderjs的特殊通信机制、地图实例生命周期管理、图层懒加载等关键技巧,帮助开发者避免常见坑点,提升应用流畅度。特别针对多语言切换、热重载偏移等疑难问题提供了解决方案,是uniapp+openlayers开发者的实用避坑指南。

weixin_30872157的博客 362

Java数据结构——二叉树

二叉树前中后序的实现、层序遍历的实现、求树的结点个数、高度等

ShirleyZ1007的博客 845

基于Xilinx_IBERT的光纤接口眼图测试

基于Xilinx_IBERT的光纤接口眼图测试

Coca_Tian的博客 1万+

Win10下YOLOv8环境搭建避坑指南:从CUDA 11.6到cuDNN配置全流程

本文详细介绍了在Windows 10系统下搭建YOLOv8环境的完整流程,包括CUDA 11.6和cuDNN的配置步骤,以及常见问题的解决方案。通过硬件准备、软件安装、环境验证和性能优化等环节,帮助开发者高效完成YOLOv8环境配置,提升目标检测项目的开发效率。

defi6farmer的博客 225

自己关于常用数据结构(链表、二叉树、栈和队列)、集合框架与Collections工具类的学习笔记整理

学习集合框架是学习javaSE必不可少的一个重点,欢迎大家指正错误!

lijinghua的博客 429

火山引擎实时对话AI实战:5分钟搞定WebRTC+大模型+ASR/TTS全链路集成

本文详细介绍了如何利用火山引擎的实时对话AI解决方案,快速集成WebRTC、大模型、ASR和TTS服务,构建低延迟、高保真的实时语音对话应用。通过实战代码示例,从环境准备、音频流管理到全链路串联与性能优化,为开发者提供了一套端到端的集成指南,适用于智能客服、在线教育等互动场景。

weixin_29051245的博客 1129

【Java---数据结构】二叉树(实践篇)

简单说明: 这篇文章的内容是建立在了解二叉树的基本概念、特性、性质等内容的基础上所介绍的,如果对二叉树的性质不太了解的朋友,可以阅读本人前面所介绍的关于二叉树理论知识的文章。 文章导航:........... 一、二叉树的存储 二叉树的存储结构分为:顺序存储和类似于链表的链式存储。(本文主要介绍二叉树的链式存储) 二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式。 二叉:孩子表示法 三叉:孩子双亲表示法 // 孩子表示法 class Node { .

.很冷的博客 1598

001、专栏导论:为什么我们需要MLIR与算子中间表示

五年前,大家还在争论“TVM还是XLA”。现在回头看,TVM的Relay IR和XLA的HLO都是特定领域的IR,它们解决了各自的问题,但缺乏通用性。MLIR的出现,本质上是因为硬件异构化已经到了一个临界点——CPU、GPU、NPU、DSP、FPGA,每个硬件都有自己的指令集和内存层次,没有一个统一的IR能同时高效表达所有硬件的计算模式。MLIR的“方言+渐进式lowering”模式,恰好提供了这种灵活性。你可以为每个硬件定制一套方言,然后共享公共的lowering路径。

Jack010169的博客 488

基于Python的虚拟货币社区情绪分析与市场价格预测爬虫实现

本文探讨了如何利用Python爬虫技术获取虚拟货币社区数据,并通过情感分析预测市场价格走势。我们将使用最新的异步爬虫框架、自然语言处理技术和机器学习模型,构建一个完整的社区情绪分析系统。本文提供了详细的代码实现和理论解释,适合作为毕业设计参考。关键词:Python爬虫、虚拟货币、情感分析、价格预测、异步爬虫、机器学习爬虫框架aiohttp和httpx用于异步HTTP请求HTML解析和parsel数据存储MongoDB和Pandas用于数据处理自然语言处理库和VADER情感分析工具机器学习和。

2201_76125261的博客 523

java 树结构数据类型_数据结构中的树类型

java 树结构数据类型In this article, we will learn about tree and some of the common types of trees in data structure. 在本文中,我们将学习树以及数据结构中一些常见的树类型。 Tree in computer science is like a tree in the real world, ...

culing2941的博客 2027

基于深度学习的鸟类检测识别系统:YOLOv5 + YOLOv8 + YOLOv10 + UI界面 + 数据集

YOLOv5是当前目标检测领域非常流行的模型,具有良好的检测精度和实时推理速度。其网络结构相比前几代YOLO模型进行了优化,尤其是在检测精度和计算效率上有了显著提高。YOLOv5特点高效性:能够在较低的硬件环境下进行实时检测。易于部署和使用:YOLOv5提供了简单的API接口,方便开发者快速集成和使用。优异的精度:在多个数据集上测试,表现出色。本文详细介绍了基于YOLOv5、YOLOv8和YOLOv10的鸟类检测识别系统的设计与实现。

YOLO 1114

数据结构的Java实现——二叉树

二叉树的二叉链表实现、先序、中序、后序遍历实现

山顶冻人的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 数据结构 二叉树

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:有一个特殊的结点,称为根结点,根结点没有前驱结点

N_0050的博客 1036

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java数据结构:初识二叉树

本篇将开启二叉树探索之旅,初识非线性结构,认识什么是树🌳 ,什么是二叉树,让我们发车吧 初一十五的月亮  天天变的不一样  原来所谓地久天长  也只是误会一场 那首歌我慢慢唱  你问我爱你有多深  我爱你有几分 —— 月亮代表谁的心 DT

LL_break的博客 2041

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数据结构(Java)——二叉树

本文主要讲二叉树的概念、专业术语、遍历和一些其他的操作

wx2023_10_15的博客 2122

数据结构-5.Java. 二叉树

本篇博客给大家带来的是二叉树的知识点, 其中包括面试经常会提问的真题 ArrayList 和 LinkedList 的区别 .文章专栏:Java-数据结构若有问题 评论区见如果你不知道分享给谁,那就分享给薯条。你们的支持是我不断创作的动力 .

薯条不要番茄酱的博客 3114

数据结构二叉树的Java实现

本篇博文用java实现了数据结构中的二叉树 源码分享在github:数据结构,当然你也可以从下面的代码片中获取 1.二叉树节点类 BiTreeNode.java package code.tree; public class BiTreeNode { public Object data;//节点的数据域 public BiTreeNode lChild,rChild;//左右孩...

baidu_41860619的博客 593

Java数据结构(二叉树)

二叉树(Binary Tree) 是一种非线性的数据结构,由节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树可以为空(没有节点),也可以是一个根节点加上两个互不相交的左子树和右子树。如图所示:满二叉树和完全二叉树是两种特殊的二叉树结构。满二叉树:所有层都填满节点的二叉树,即每个节点要么是叶子节点,要么有两个子节点。完全二叉树:除了最后一层外,其他所有层都被完全填满,并且最后一层的节点全部靠左排列。

2301_79482961的博客 1004

【Java数据结构】03-二叉树,树和森林

讲解二叉树、树和森林的定义以及它们之间的异同点,四种遍历、二叉检索树、Huffman编码以及堆的实现、树和森林与二叉树的转换

m0_73569204的博客 1450

Java学习——数据结构——线索化二叉树

学习尚硅谷韩顺平老师的Java数据结构笔记,详情请移步网站 1、引子 问题分析: (1) 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } (2) 但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上. (3) 如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办? (4) 解决方案-线索二叉树 2、基本介绍 (1) n 个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表

qq_41853002的博客 296

数据结构 | 二叉树遍历(Java)

二叉树的节点定义

xxzaa的博客 1119

JAVA数据结构基础--二叉树

JAVA数据结构基础–二叉树 定义: 是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。 二叉树的递归定义为: 二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 二叉树特类型: 1:满二叉树: 只有度为0的结点和度为2的结点,并且度为0的结点在同一层上的二叉树。 2:完全二叉树: 深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k,有n个结点的满二叉树中编号从1到n的结点一一对应时 二叉树完

qq_45351128的博客 301
上一篇: JAVA数据结构——线性表
下一篇: JAVA数据结构——堆
NJfunkGiser
博客等级 码龄10年 4粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值