java【二叉树】

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

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

下面的一个 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 引用 • 8216 回帖
  • 二叉树
    8 引用 • 1 回帖
  • 数据结构
    87 引用 • 115 回帖 • 4 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 317 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    495 引用 • 931 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    949 引用 • 1460 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • OneDrive
    2 引用 • 1 关注
  • OpenStack

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

    10 引用 • 5 关注
  • HHKB

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

    5 引用 • 74 回帖 • 504 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖 • 1 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 547 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 1 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 157 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 576 关注
  • OpenCV
    15 引用 • 36 回帖 • 7 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • AWS
    11 引用 • 28 回帖 • 7 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 628 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 4 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 688 关注
  • 房星科技

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

    6 引用 • 141 回帖 • 589 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 123 关注