基于 链表法 父亲长子兄弟模型树的实现 -java

来源:互联网 发布:美工每天忙吗 编辑:程序博客网 时间:2024/06/11 17:49

关于树的性质,不用多说了。

利用父亲长子兄弟模型 用java来实现了树的结构及基本操作

直接上代码:

树的ADT:

package Tree;/** *树的ADT  *父亲 长子 弟弟 模型  * @author coffee * */public interface Tree {//得到当前节点的对象public Object getElement();//设置当前节点的对象public Object setElement(Object Element);//得到当前节点的深度public int getDepth();//得到当前节点的高度public int getHeight();//返回父节点public TreeLinkedListNode getParent();//得到第一个孩子public TreeLinkedListNode getFirstChild();//得到下一个兄弟public TreeLinkedListNode getNextSubling();//得到当前节点为根的树的规模public int getSize();}


树的实现:

package Tree;/** * 链表法 父亲长子兄弟模型 * @author coffee */public class TreeLinkedListNode implements Tree{private Object element;//元素private TreeLinkedListNode parent; //父亲private TreeLinkedListNode firstChild;//第一个孩子private TreeLinkedListNode nextSibling;//下一个兄弟;public TreeLinkedListNode(Object Element,TreeLinkedListNode parent,TreeLinkedListNode firshChild,TreeLinkedListNode nextSibling){this.element=Element;this.parent=parent;this.firstChild=firshChild;this.nextSibling=nextSibling;}public TreeLinkedListNode (){this(null,null,null,null);}/** * 返回当前节点的深度 深度是根到此节点的路径长度 * depth(v)=depth(u)+1; *时间复杂度为On; */@Overridepublic int getDepth() {int depth=0;//跟节点的深度为0;初始化为0TreeLinkedListNode p = parent;while(p!=null){depth++;p = p.getParent(); //指向上一个父亲 直到父节点为null 到根节点  由于是尾递归,所以写成了遍历的形式}return depth;}/** * 用计算子节点的个数同样算出当前节点的高度 * height(v)>=height(u)+1; 如果 u为v的孩子节点 * height(v)=1+max(height(u)) u为所有孩子 * 父亲孩子兄弟模型递归方法 * @return */@Overridepublic int getHeight() {int height= -1; //叶子节点高度为0 所以初始值为-1TreeLinkedListNode subtree = firstChild;//从第一个孩子开始while(subtree!=null){height=Math.max(height,subtree.getHeight()); //返回在孩子中取得最大的高度 依次比较 nextSibling的高度和第一个孩子的高度subtree=subtree.nextSibling;}return height+1;}@Overridepublic TreeLinkedListNode getNextSubling() {return null;}/* *递归的算出当前节点所有子节点个数   *如果不计算递归 算法可以在N的时间复杂度算出size的大小  *父亲长子兄弟模型递归方法 */@Overridepublic int getSize() {int size=1;//当前及节点也是本节点的子节点 叶子节点的size就是1 ,所以初始值为1 TreeLinkedListNode subtree=firstChild; //从第一个节点开始while(subtree!=null){size+=subtree.getSize();subtree=subtree.nextSibling; //一定是子节点的兄弟节点  }return size;}//返回当前元素 设置新的元素@Overridepublic Object setElement(Object Element) {Object temp= element;element=Element;return temp;}@Overridepublic Object getElement() { return element;}public TreeLinkedListNode getParent() {return parent;}public TreeLinkedListNode getFirstChild() {return firstChild;}}


0 0
原创粉丝点击