Tree_普通树
ITree接口
public interface ITree<E>{
int getSize();//返回节点个数
TreeNode<E>getRoot();//返回树的根
TreeNode<E>getParent(TreeNode<E>x);//返回x的父节点
TreeNode<E>getFirstChild(TreeNode<E>x);//返回x的第一个孩子
TreeNode<E>getNextSibling(TreeNode<E>x);//返回x的邻近兄弟节点
int getHeight(TreeNode<E>root);//求树的高度
void insertChild(TreeNode<E>p,TreeNode<E>child);//插入孩子
void deleteChild(TreeNode<E>p,int i);//删除p的第i个孩子
List<List<TreeNode<E>>>levelOrder(TreeNode<E>x);//层次遍历
}
TreeNode节点
public class TreeNode<E>{
public E key;//节点的值
List<TreeNode<E>>children;//树的孩子
public TreeNode<E>parent;//父节点
public TreeNode(E key,TreeNode<E>parent){//构造函数
this.parent=parent;
this.key=key;
}
public TreeNode(E key){
this.key=key;
}
@Override
public String toString(){//重写toString方法
return "Node[key="+key+"]";
}
}
树的实现
public MyTree<E>implement ITree<E>{
int size;//节点个数
TreeNode<E>root;//根节点
public MyTree(TreeNode<E>root){
this.root=root;
size++;
}
@Override
public int getSize(){
return size;
}
@Override
public TreeNode<E>getRoot(){
return root;
}
@Override
public TreeNode<E>getParent(TreeNode<E>x){
return x.parent;
}
@Override
public TreeNode<E>getFirstChild(TreeNode<E>x){
return x.children.get(0);
}
@Override
public TreeNode<E>getNextSibling(TreeNode<E>x){
List<TreeNode<E>>child=x.parent.children;
int i=child.indexOf(x);
try{
return child.get(i+1);
}catch(Exception e){
return null;
}
}
@Override
public void insertChild(TreeNode<E>p,TreeNode<E>x){
if(p.children==null)p.children=new ArrayList();
p.children.add(x);
x.parent=p;
size++;
}
@Override
public void deleteChild(TreeNode<E>p,int i){
p.children.remove(i);
size--;
}
@Override
public int getHeight(TreeNode<E>x){
if(x.children==null)return 0;
int h=0;
for(int i=0;i<x.children.size();i++){
h=max(h,getHeight(x.children.get(i)));
}
return h+1;
}
public int max(int x,int y){//返回最大的那个数
return x>y?x:y;
}
public int getHeight(){
return getHeight(root);//返回整棵树的节点
}
@Override
public List<List<TreeNode<E>>>levelOrder(TreeNode<E>x){
List<List<TreeNode<E>>>res=new ArrayList();//存放list的list
TreeNode<E>last=x;//标记当前行
TreeNode<E>nlast=null;//标记上一行
Queue<TreeNode<E>>q=new LinkedList();
List<TreeNode<E>>l=new ArrayList();
q.add(x);
res.add(l);
while(!q.isEmpty()){
TreeNode<E>peek=q.peek();
if(peek.childre!=null){
for(TreeNode<E>n:peek.children){//弹一个加n个
q.add(n);
nlast=n;
}
}
l.add(p.poll());//弹出
if(last==peek&&!q.isEmpty(){//弹出的节点等于当前标记的节点
l=new ArrayList();
res.add(l);
last=nlast;//更新标记
}
}
return res;
}
}