java【二叉树】

本贴最后更新于 1533 天前,其中的信息可能已经事过景迁

上一篇文章为大家带来了一个关于链表的结构实现,我采用是内部类实现方式,那对于链表而言的话,链表缺点就是检索数据,那当然有人会提出一些优化方法,例如我们在学习集合时候了解到,二叉树,红黑树等,在数据改变的情况,进行对数据旋转,达到一个树的左右平衡,以此达到一个最佳的数据检索到效率。

下面的一个 demo 主要便于我们理解二叉树数据结构,同样我们采用也是内部类的方式,对于红黑树的话,其实是在二叉树的基本在进行进一步数据优化,但是目前我还不能用代码的形式为大家展示【很复杂 😭 】,有兴趣的可以去关于数据结构的书籍。

不说了,上代码

代码里面有注解大部分设计思路。

package ITaljavaT3; /** * 实现二叉树的操作 * @author Administrator * @param <T> 要进行二叉树的实现 * <? extends Comparable<? super T>> * 代表任何实现了comparable接口的实例,且接口的类型是comparable<T 或其父类>。 <T extends Comparable<? super T>> 代表类型是T的实例,且这个T要实现comparable 接口,接口的类型是comparable<T 或其父类> */ class BinaryTree< T extends Comparable<T>>{ //节点内部类 private class Node{ private Comparable<T> date;//保存数据在comparable中可以进行大小的比较,还可以进行向下强制性转换; private Node parent; //保存父节点 private Node left; //保存左节点 private Node right; //保存左节点 public Node(Comparable<T> date) { this.date=date;//进行数据的初始化 } /** * 进行数据的保存处理 * @param date 需要进行保存的数据 */ public void addarrays(Node newNode) { //将当前的数据和newNode类中的数据进行比较,如果大于0,向右,小于0向左 if(newNode.date.compareTo((T)this.date)<=0) { if(this.left==null) {//现在没有左子树 this.left=newNode;//进行数据的保存 newNode.parent=this;//进行父节点的保存 }else {//继续进行左子树的判断 this.left.addarrays(newNode); } }else { if(this.right==null) {//右子树为的话 this.right=newNode;//进行右子树保存 newNode.parent=this;//进行父节点的保存 }else {//继续济宁右子树的判断 this.right.addarrays(newNode); } } } /** * 采用中序遍历的方式进行数据的输出 */ public void toarraysNode() { //左 if(this.left!=null) {//左子树不为空话 //继续进行数据的获取 this.left.toarraysNode(); } //进行数据的获取并且复制(数据的获取) BinaryTree.this.returndate[BinaryTree.this.foot++]=this.date; //右 if(this.right!=null) {//右子树不为空 //继续进行数据的获取 this.right.toarraysNode(); } } //进行数据的查询 public boolean judgedate(Comparable<T> date) { if(date.compareTo((T)this.date)==0) { return true; }else if(date.compareTo((T)this.date)<0) {//左边有数据 if(this.left!=null) { //递归调用 return this.left.judgedate(date); }else { return false; } }else { if(this.right!=null) { //递归调用 return this.right.judgedate(date); }else { return false; } } } //进行删除数据的获取 public Node getRemoveNode(Comparable<T> date) { if(date.compareTo((T)this.date)==0) { return this; }else if(date.compareTo((T)this.date)<0) {//左边有数据 if(this.left!=null) { //递归调用 return this.left.getRemoveNode(date); }else { return null; } }else { if(this.right!=null) { //递归调用 return this.right.getRemoveNode(date); }else { return null; } } } } //---------------以下时候BinaryTree中的操作-------------------------- private Node root; //二叉树的根节点 private int count; // 保存数据的个数 private Object[] returndate;// 进行数据返回 private int foot=0;//进行数据返回的角标处理 /** * 进行数据的保存操作 * @param date 要保存的数据内容 */ public void add(Comparable<T> date) { if(date==null) { throw new NullPointerException("date数据为空"); } //所有的数据是不存在数据的节点操作的,所有需要将数据存在节点中 Node newNode=new Node(date); if(this.root==null) { this.root=newNode;//判断节点是否为空,为空的话,将数据赋值给根节点 }else { this.root.addarrays(newNode);//将数据添加的操作给Node进行数据的处理 } this.count++; } //进行数据的添加以后,就得进行数据的返回操作 public Object[] getarray() { if(this.count==0) { return null; } //进行数据的返回操作 this.returndate=new Object[this.count];//进行数组的长度保存 this.foot=0;//角标清零 this.root.toarraysNode();//将这个获取数据的操作交给Node类进行数据的获取处理 return this.returndate; } //进行数据的查询(判断数据是否存在) public boolean seacherdate(Comparable<T> date) { if(date==null) { return false; } return this.root.judgedate(date); } //进行删除数据的获取,然后进行数据的删除 public void remove(Comparable<T> date) { if(date==null && this.root.judgedate(date)) { System.out.println("数据查询不到"); return ; }else { //进行判断删除的是否为根节点 if(date.compareTo((T)this.root.date)==0){ //进行根节点的删除 Node move=this.root.right;//移动的角标对象 while(move.left!=null) { move=move.left;//一直进行最最左边的数据进行获取 } move.left=this.root.left;//左边进行赋值 move.right=this.root.right;//右边赋值 move.parent.left=null;//原始上一个节点的去除 this.root=move; }else { Node removeNode=this.root.getRemoveNode(date);//获取到需要删除的Node类 if(removeNode.left==null && removeNode.right==null) { removeNode.parent.left=null; removeNode.parent.right=null; //removeNode.parent=null; }else if(removeNode.left==null && removeNode.right!=null) { //将删除Node类的下一个类中right改成删除类的上一个的左节点,然后将其删除类的right中的父节点改成删除类的上一个当前对象 removeNode.parent.left=removeNode.right; removeNode.left.parent=removeNode.parent; }else if(removeNode.left!=null && removeNode.right==null) { removeNode.parent.left=removeNode.left; removeNode.left.parent=removeNode.parent; }else { //两者都存在的情况(这种情况是将删除数据替换成右边最左下角的那个对象Node) Node moveNode=removeNode.right; while(moveNode.left!=null) { moveNode=moveNode.left; } //左替换 moveNode.left=removeNode.left; //右替换 moveNode.right=removeNode.right; //上一个节点的左节点替换 removeNode.parent.left=moveNode; moveNode.parent.left=null; //原始断开左节点 //父类替换 moveNode.parent=removeNode.parent; } } this.count--; } } } class person implements Comparable<person>{ private String name; private int age; public person(String name,int age) { this.name=name; this.age=age; } @Override public int compareTo(person per) { // TODO Auto-generated method stub if(this.age>per.age) { return 1; }else if (this.age<per.age){ return -1; } return 0; } @Override public String toString() { // TODO Auto-generated method stub return "姓名"+this.name+"年龄"+this.age+"\n"; } } public class javaDemo01{ public static void main(String[] args) { //进行数据的添加 BinaryTree<person> bt=new BinaryTree<person>(); bt.add(new person("小强-80",80)); bt.add(new person("小强-50",50)); bt.add(new person("小强-30",30)); bt.add(new person("小强-60",60)); bt.add(new person("小强-10",10)); bt.add(new person("小强-55",55)); bt.add(new person("小强-70",70)); bt.add(new person("小强-90",90)); bt.add(new person("小强-85",85)); bt.add(new person("小强-95",95)); //进行数据的获取 Object[] obj=bt.getarray(); for(Object temp:obj) { System.out.println(temp); } //进行数据的删除 //bt.remove(new person("小强10",10)); //bt.remove(new person("小强30",30)); //bt.remove(new person("小强80",80)); bt.remove(new person("小强50",50)); System.out.println("删除以后进行遍历"); Object[] obj2=bt.getarray(); for(Object temp:obj2) { System.out.println(temp); } } }
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • 二叉树
    8 引用 • 1 回帖
  • 数据结构
    87 引用 • 115 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 641 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 408 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 43 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 671 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 246 回帖 • 1 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 522 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1127 回帖 • 108 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 610 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 519 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 78 关注
  • 自由行
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 242 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    346 引用 • 757 回帖
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 2 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • AWS
    11 引用 • 28 回帖 • 9 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 663 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖
  • 996
    13 引用 • 200 回帖 • 1 关注
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖