java【二叉树】

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

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

下面的一个 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 27 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 548 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    135 引用 • 798 回帖 • 2 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    188 引用 • 833 回帖 • 2 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 598 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 197 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    203 引用 • 4024 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • SSL

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

    70 引用 • 193 回帖 • 404 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    43 引用 • 130 回帖 • 259 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖 • 2 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    200 引用 • 545 回帖
  • Visio
    1 引用 • 2 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 430 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    599 引用 • 3541 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 429 关注
  • TGIF

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

    293 引用 • 4496 回帖 • 688 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 99 关注
  • Folo

    Folo 是一个 RSS 阅读和信息聚合应用,整合多种内容源到统一时间线。

    项目地址:https://github.com/RSSNext/Folo

    1 引用 • 3 回帖 • 2 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有机会重制。

    14 引用 • 258 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注