Tree

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;
}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏之翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值