数据结构之设计
☺ 数据结构之设计☺
1,动态数组的设计
2,链表的设计
(结点Node模型 也设计成一个类,因为它只在 链表内部使用,所以它是链表类的内部类)
3,双向链表的设计:(链表模式中 first 指向了 头结点, last 指向了尾结点)
好处:当要找的index 大于 size 的一半(size >> 1),last指针开始从后到前寻找
当要找的index 小于 size 的一半 (size >> 1),first指针开始从前到后寻找
4,对于接口的完美利用:
1,遇到局限情况:
二叉树的遍历:“被写死”:只能打印出该结点:
System.out.println(node.elmement);
2,设计改善:
传入一个接口变量的参数(该接口定义了一个方法(该方法有一个参数是结点参数))
因为是接口,则外界使用到它时,便需要实现它的方法,而它的方法就含有结点参数
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3,设计增强:(层序遍历)
增强遍历:通过接口方法的返回值,控制遍历的停止(so 接口方法需要写成可以被控制的,例如布尔类型)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3-2,设计增强:(前序遍历/中序遍历/后序遍历)
区别:前序遍历/中序遍历/后序遍历 与 层序遍历的最大区别是:前者使用了递归,后者就是普通的迭代。
应对差异的区别:层序遍历可以直接止步于当前,而使用了递归的前序遍历/中序遍历/后序遍历的止步需要看前一步的结果,so 需要有一个变量记录。
●如果是前序定义一个记录变量,中序定义一个记录变量,后序定义一个记录变量的话,定义的变量有点多(第一个缺点),
●而且定义的变量必须是全局变量(但是使用多线程的话,造成线程不安全~第二个缺点)
☺发现了接口对象vistitor 是具有全局的特点(因为自从外界传入之后,使用的vistitor 便是同一个,
我们希望往visitor 对象中添加属性,但是vistior是接口,so 修改成灵活的抽象类)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5,对于已知类的功能的扩展:
☺组合关系:在已知类内部定义一个属性对象
☺继承关系:让已知类对某个接口或者抽象类(或者是普通父类)进行继承
☺强制类型转化:将原对象转换成接口对象/抽象类(或者普通父类)对象,便可以使用转化的对象的接口方法
● 举例子:二叉搜索树,扩展功能---------比较大小(制定一定比较规则):(这样就方便二叉搜索树另外一个接口-添加接口的实现)
组合关系:
可以看到:java内置的Comparator<T> 的样子:
☺组合关系的代码实现:--------------------------------------------------------------------
------------------------------------------------------------------------------------------------
继承关系:
因为java.lang.Comparable<T> 已经内置实现好了,不用自己再实现该接口哈哈哈
可以看到:java 内置的Comparable<T> 的样子:
☺继承关系的代码实现:-------------------------------------------------------------------
-------------------------------------------------------------------------------------------
☺强制类型转化的代码实现:---------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
6,对于已知类的功能的扩展:
【自己写一个方法,但是这个方法根据它的特性,放到已知类的子类更加合适】,问题变成了父类如何引用到子类的方法
------还是定义接口(可以是接口类中的方法、或者直接是已知类的抽象方法、普通方法),让子类实现即可。
例子:BST(二叉搜索树~已知类)、继承 BST的 AVL 子类:想拥有高度平衡的功能,需要思考:什么时候需要调整高度?添加结点之后,而这个调整高度的接口方法的实现更应该写到子类AVL 中去,可以先只是在父类BST类中定义一个接口方法,在子类AVL 进行重写。
✿ 补充一下:平衡因子【结点高度】~ 如果是想直接写到BT(二叉树的结点类Node 中,就会使得通用的Node 类多了一个不是通用的属性,不符合设计,需要谁需要平衡因子,就谁自己添加上它,解决:可以采用继承的方式,在AVLTree 中,进行再定义一个AVLTreeNode 特有的结点类(该类继承了BT中Node 类。))
本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15378281.html