/**
*@Title:
*@Description:树ADT接口
*@Author:fengbin
*@Since:2018年4月8日
*@Version:1.1.0
*/
public interface Tree {
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点存放的对象
*/
public Object getElem();
/**
* @param object
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:存入当前节点,并返回此前的内容
*/
public Object setElem(Object object);
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点的父节点
*/
public TreeLinkedList getParent();
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点的长子
*/
public TreeLinkedList getFirstChild();
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点的最大弟弟
*/
public TreeLinkedList getNextSiling();
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点为根节点的子树规模
*/
public int getSize();
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点的高度
*/
public int getHeight();
/**
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:返回当前节点的深度
*/
public int getDepth();
}
package algorithtms.tree;
import java.util.ArrayList;
import java.util.List;
/**
*@Title:
*@Description:基于链表的树实现
*@Author:fengbin
*@Since:2018年4月8日
*@Version:1.1.0
*/
public class TreeLinkedList implements Tree{
private Object elem;
/**
* 树的父亲,长子及最大的弟弟
*/
private TreeLinkedList parent,firstChild,nextSibling;
public TreeLinkedList(Object e,TreeLinkedList p,TreeLinkedList f,TreeLinkedList n) {
elem = e;
parent =p;
firstChild =f;
nextSibling =n;
}
public TreeLinkedList() {
this(null, null, null, null);
}
public Object getElem() {
return elem;
}
public Object setElem(Object object) {
Object old =elem;
elem = object;
return old;
}
public TreeLinkedList getParent() {
return parent;
}
@Override
public TreeLinkedList getFirstChild() {
return firstChild;
}
@Override
public TreeLinkedList getNextSiling() {
return nextSibling;
}
/* 返回当前节点的后代元素的数目,以当前节点为根节点的树的规模
* @see algorithtms.tree.Tree#getSize()
*/
public int getSize() {
//当前节点也是自己的后代
int size =1;
TreeLinkedList subtree = firstChild;
while(null!=subtree){
//依次累加
size +=subtree.getSize();
//所有孩子的后代数目
subtree = subtree.getNextSiling();
}
return size;
}
@Override
public int getHeight() {
int height = -1;
//
TreeLinkedList subtree = firstChild;
while(null!=subtree){
//所有孩子中最大的高度
height =Math.max(height, subtree.getHeight());
}
return height+1;
}
@Override
public int getDepth() {
int depth = 0;
TreeLinkedList p =parent;
while(null!=p){
depth++;
p =p.getParent();
}
return depth;
}
/**
* @param node
* @return
* @Author:fengbin
* @Since:2018年4月9日
* @Description:输入树节点node,输出node节点所有后代的前序遍历序列
*/
public List<TreeLinkedList> preorderTraversal(TreeLinkedList node){
List<TreeLinkedList> list = null;
if(null!=node){
TreeLinkedList u ;
for (u =node.getFirstChild();null!=u;u=u.getNextSiling()) {
list = new ArrayList<TreeLinkedList>();
preorderTraversal(u);
list.add(u);
}
}
return list;
}
}