编写TreeSet类的实现程序,其中相关的迭代器使用二叉查找树

package com.test.tree;import java.util.Iterator;/*** 编写TreeSet类的实现程序,其中相关的迭代器使用二叉查找树。* 在每个节点上添加一个指向其父节点的链* @author wyl* @param <T>*/
public class MyTreeSet<T extends Comparable<? super T>> {private BinaryNode<T> root; //根节点int modCount = 0;  //记录调整树结构的次数public MyTreeSet(){root = null;}/*** 定义二叉查找树的节点*/private class BinaryNode<T>{T data; //节点的值BinaryNode<T> left; //节点的左节点BinaryNode<T> right; //节点右节点BinaryNode<T> parent; //节点的父节点public BinaryNode(T data){this(data, null, null, null);}public BinaryNode(T data, BinaryNode<T> lt, BinaryNode<T> rt, BinaryNode<T> pt) {this.data = data;this.left = lt;this.right = rt;this.parent = pt;}}/*** 定义TreeSet的迭代器* @return*/public Iterator iterator(){return new MyTreeSetIterator();}private class MyTreeSetIterator implements Iterator {private BinaryNode<T> current = findMin(root);private BinaryNode<T> previous;private int expectedModCount = modCount;private boolean okToRemove = false;private boolean atEnd = false;@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn !atEnd;}@Overridepublic T next() {// TODO Auto-generated method stubif(modCount != expectedModCount){try {throw new CurrentModificationException();} catch (CurrentModificationException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}}if(!hasNext()){try {throw new NoSuchElementException();} catch (NoSuchElementException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}}T nextItem = current.data;previous = current;if(current.right != null){current = findMin(current.right);}else{BinaryNode<T> child = current;current = current.parent;while(current != null && current.left != child){child = current;current = current.parent;}if(current == null){atEnd = true;}}okToRemove = true;return nextItem;}@Overridepublic void remove(){// TODO Auto-generated method stubif(modCount != expectedModCount){try {throw new CurrentModificationException();} catch (CurrentModificationException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}}if(!okToRemove){throw new IllegalStateException();}try {MyTreeSet.this.remove(previous.data);} catch (UnderflowException e) {// TODO Auto-generated catch block
                e.printStackTrace();}okToRemove = false;}}public void makeEmpty(){modCount++ ;root = null;}public boolean isEmpty(){return root == null;}public boolean contains(T x){return contains(x, root); }public boolean contains(T x, BinaryNode<T> t){if(t == null){return false;}int compareResult = x.compareTo(t.data);if(compareResult < 0){return contains(x, t.left);}else if(compareResult > 0){return contains(x, t.right);}else{return true;}}public T findMin(){if(isEmpty()){try {throw new UnderflowException();} catch (UnderflowException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}return findMin(root).data;}public T findMax(){if(isEmpty()){try {throw new UnderflowException();} catch (UnderflowException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}return findMax(root).data;}public void insert(T x){root = insert(x, root, null);}public void remove(T x) throws UnderflowException{root = remove(x, root);}public void printTree(){if(isEmpty()){System.out.println("Empty tree");}else{printTree(root);}}public void printTree(BinaryNode<T> t){if(t != null){printTree(t.left);System.out.println(t.data);printTree(t.right);}}public BinaryNode<T> remove(T x, BinaryNode<T> t){if(t == null){try {throw new UnderflowException();} catch (UnderflowException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}int compareResult = x.compareTo(t.data);if(compareResult < 0){t = remove(x, t.left);}else if(compareResult > 0){t = remove(x, t.right);}else if(t.left != null && t.right != null){//要删除的节点是含有左右子树的节点t.data = findMin(t.right).data;//将右子树的最小值作为根节点t.right = remove(t.data, t.right);}else{modCount++ ;BinaryNode<T> oneChild;oneChild = (t.left == null)?t.left:t.right;oneChild.parent = t.parent;t = oneChild;}return t;}public BinaryNode<T> insert(T x, BinaryNode<T> t, BinaryNode<T> parent){if(t == null){modCount++ ;//空树return new BinaryNode(x, null, null, parent);}int compareResult = x.compareTo(t.data);if(compareResult < 0){//要插入的数小于节点值,插入到左子树t.left = insert(x, t.left, t);}else if(compareResult > 0){//要插入的数小于节点值,插入到左子树t.right = insert(x, t.right, t);}else{}return t;}public BinaryNode<T> findMin(BinaryNode<T> t){// TODO Auto-generated method stubif(t == null){try {throw new UnderflowException();} catch (UnderflowException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}else if(t.left == null){return t;}return findMin(t.left);}public BinaryNode<T> findMax(BinaryNode<T> t){// TODO Auto-generated method stubif(t == null){try {throw new UnderflowException();} catch (UnderflowException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}else if(t.right == null){return t;}return findMax(t.right);}public static void main(String[] args) {MyTreeSet<Integer> myTreeSet = new MyTreeSet<Integer>();myTreeSet.insert(24);myTreeSet.insert(23);myTreeSet.insert(16);myTreeSet.insert(20);myTreeSet.insert(28);myTreeSet.insert(29);System.out.println("最小值: "+ myTreeSet.findMin());System.out.println("最大值: "+ myTreeSet.findMax());Iterator iter = myTreeSet.iterator();while(iter.hasNext()){System.out.print(iter.next() + "、");}}
}
class UnderflowException extends Exception{}
class CurrentModificationException extends Exception{}
class NoSuchElementException extends Exception{}

 

转载于:https://www.cnblogs.com/studyDetail/p/7155989.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东北天到ecef的变换_GNSS学习笔记-坐标转换

GNSS 坐标转换GNSS计算主要涉及三个坐标系&#xff0c;地心地固坐标系&#xff0c;地理坐标系和站心坐标系。这里主要介绍一下三个坐标的含义和转换公式。地心地固坐标系如图X,Y,Z表示 (ECEF坐标系)&#xff0c;以地心O为坐标原点&#xff0c;Z轴指向协议地球北极&#xff0c;X…

设计模式之模版方法模式的钩子方法

public abstract class SoyaMilk {//模版方法 可以做成finaL&#xff0c;不让子类去覆盖final void make(){select();if(customerWantCondiments()){addCondiments();}soak();beat();}void select(){System.out.println("第一步&#xff0c;请选择好的新鲜黄豆");}/…

利用福禄克铜缆测试仪测试铜缆的插入损耗

由于插入损耗发生在任何类型的传输中&#xff0c;因此它也是铜缆布线系统中的一个性能参数。与光纤相比&#xff0c;铜缆布线系统的插入损耗要大得多。另一个关键区别是&#xff0c;铜缆上的信号损耗随着信号频率的变化而变化&#xff0c;对于更高频率的信号&#xff0c;铜缆链…

交换机配置全接触

交换机配置全接触交换机的配置一直以来是非常神秘的&#xff0c;不仅对于一般用户&#xff0c;对于绝大多数网管人员来说也是如此&#xff0c;同时也是作为网管水平高低衡量的一个重要而又基本的标志。这主要在两个原因&#xff0c;一是绝大多数企业所配置的交换机都是桌面非网…

python变量名可以包含的字符有问号吗,带问号文字的Python正则表达式

Im using Djangos URLconf, the URL I will receive is /?codeauthenticationcodeI want to match the URL using r^\?code(?P.*)$ , but it doesnt work.Then I found out it is the problem of ?.Becuase I tried to match /aaa?aaa using raaa\?aaa raaa\\?aaa even …

Yii2 mongodb 扩展的where的条件增加大于 小于号

1. mongodb的where中有比較丰富的 条件。例如以下&#xff1a; static $builders [NOT > buildNotCondition,AND > buildAndCondition,OR > buildOrCondition,BETWEEN > buildBetweenCondition,NOT BETWEEN > buildBetweenCondition,IN > buildInCondition,…

子网计算菜鸟入门

其实关于子网计算的文章很多&#xff0c;无论是书本上还是网络上都能找到&#xff0c;但有一点大家可能都忘记了&#xff0c;那就是在学会计算子网之前&#xff0c;必 须要对IP地址和子网掩码的原理做一个比较正确地理解&#xff0c;可以说&#xff0c;理解了原理之后&#xff…

福禄克Fluke Pro3000 音频发生器和探头

虽然按照ANSI/TIA-606-B管理标准贴标签被认为是好做法&#xff0c;但让我们面对现实&#xff1a;标签并不总是出现&#xff0c;或者有时它们根本看不到您需要它们的地方。随着时间的推移&#xff0c;电信机房或数据中心的布线链路也可能已重新配置。当你需要追踪一根电缆或者在…

python3.0 数据类型、万恶的编码、文件操作

一、数据类型整理 1、字符串 概念&#xff1a;字符串就是一串字符。**注&#xff1a;python中没有字符概念。但其他语言有。字符串无法变更&#xff0c;每次变更相当于生成新的字符串 a、增 b、删 c、查 for i in 字符串 index() d、改 replace(old,new) "分隔符".jo…

判定2022年是否闰年c语言_C语言接本真题分享19年(2)

点击蓝字 关注我们C语言河北省 2019 年普通高校专科接本科教育选拔考试计算机科学与技术/软件工程/网络工程/物联网工程专业试卷 AC 语言程序设计(满分 150 分)第二部分|二、程序阅读题(本大题共 5 小题&#xff0c;每小题 6 分&#xff0c;共 30 分。请将程序的运行结果填写在…

oracle insert 新增语句

insert into 表名 values(值1&#xff0c;值2&#xff0c;......); insert into 表名(列1&#xff0c;列2&#xff0c;......)values(值1&#xff0c;值2&#xff0c;......);

福禄克网络TIA识别MPTL连接的操作方法

如果您熟悉水平电缆在一端终止于RJ-45插头直接连接到设备的部署&#xff0c;那么您就熟悉现在所称的模块化插头终止链路或MPTL&#xff08;即使并非总是以这种方式提及&#xff09;。 虽然先前在楼宇自动化和电子安全和安保标准中得到认可&#xff08;以前称为“直接连接”&am…

解决NHibernate 中与 SQL2005 关键字有冲突的问题

环境&#xff1a;NHibernate&#xff0c;sql2000 现象&#xff1a;当表名或字段名和sql2000关键字有冲突时&#xff0c;会出错。 解决方法&#xff1a;在 NHibernate 映射配置文件中&#xff0c;的将表名或字段名用两个重音符号&#xff08;&#xff09;括起来。重音符号键即是…

新手攻略熔炉_【新手攻略】快速入门

进图之后找城主接取任务前期主要经济等级来源&#xff0c;3级去学技能用杀敌数找天使妹妹随机潜力值潜力值关系到每次升级的属性分配点潜力果实可以不改变星级重新随机分配点这一点小伙伴们要注意随机到高星的潜力可就可以留下来用达到3级找书店老板学习技能Q3级Q&#xff0c;5…

【Python图像特征的音乐序列生成】解析ABC格式的文件(修改版)

ABC格式&#xff0c;是一个音乐标准&#xff0c;ABC Plus Project最新的标准是2.x。 ABC格式的音乐长成这样&#xff1a; 1 X: 22 T:Abacus3 % Nottingham Music Database4 S:By Hugh Barwell, via Phil Rowe5 R: Jig6 M:6/87 K:G8 "G"g2g B^AB|d2d G3|"Em"…

BigDecimal类型一定不会失真吗?不一定。参数类型为double的构造方法的结果有一定的不可预知性,是有可能产生失真的。

BigDecimal类型一定不会失真吗&#xff1f; 不一定。 参数类型为double的构造方法的结果有一定的不可预知性&#xff0c;是有可能产生失真的。 public class Test1 {public static void main(String[] args) {BigDecimal b1 new BigDecimal(123.24);System.out.println(b1);B…

虚拟化简化数据中心管理

【CNW.com.cn 专稿】计算中心作为国家统计局IT基础设施服务的部门&#xff0c;管理着240多台x86服务器、30多台小型机&#xff0c;由于正式编制只有4人&#xff0c;因此面临着非常高的管理挑战。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:off…

OTDR光纤测试仪:您的光纤终极故障排除工具

因此&#xff0c;您已经完成了光缆安装&#xff0c;现在开始使用光纤损耗测试仪&#xff08;OLTS&#xff09;对光缆设备进行认证——这是您进行Tier 1认证和使用OFP光纤测试仪OTDR进行测试所需的工具&#xff0c;最准确地测量损耗&#xff0c;以确保应用支持。 不幸的是&…

三点估算pmp_我本人是做项目经理的,我把考PMP也当成一个项目来规划

一&#xff0e; 辅导班的好处咨询过几位前辈后&#xff0c;我毫不犹豫的选择参加辅导班。说服自己的理由至少有以下三点&#xff1a;1&#xff0e; PMP指南对大部分人是陌生的新学科和新模式&#xff0c;普遍反映上面的话不是人的语言&#xff0c;参加培训班可以有专业的老师讲…