一般树形结构_求通路长度

i
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import cn.itcast.tree.MyTree.Node;

class MyTree{
	
	private List<Node> lst = new ArrayList<Node>();
	class Node{
		String data;
		String parent;
	}

	public void add(String parent,String child){
		//增加,当前节点的数据作为孩子节点
		Node t = new Node();
		t.data = child;
		t.parent = parent;
		lst.add(t);
	}
	
	//这里t对于取得的父节点列表,下面会调用的
	List<String> t = new ArrayList<String>();
	public String getParent(String x){
		//从树的根节点开始遍历,若他的当前节点的数据等于x,则他的父节点就是parent
		for(int i = 0;i<lst.size();i++ ){
			if(lst.get(i).data.equals(x)) {
				
				x = lst.get(i).parent;
				t.add(lst.get(i).parent);				
				return getParent(x);
			}
		}
		return null;
	}
	
	// 清空临时数组t
	public void clearT() {
		t.clear(); 
	}

	//取得两点之间的距离
	public void lengthBetween(MyTree tree,String begin,String end){
		
		List<String> a = new ArrayList<String>();
		List<String> b = new ArrayList<String>();
		tree.getParent(begin);
		for (int i = 0; i < tree.t.size(); i++) {
			a.add(tree.t.get(i));
		}
		
		tree.clearT();// 清空列表
		
		tree.getParent(end);
		for (int i = 0; i < tree.t.size(); i++) {
			b.add(tree.t.get(i));
		}
		
		List<Integer> temp = new ArrayList<Integer>();
		for (int i = 0; i < a.size(); i++) {
			for (int j = 0; j < b.size(); j++) {
				if (a.get(i).equals(b.get(j))) {
					temp.add(i + j + 2);// 如果有多条路径,放入temp中
				}
			}
		}
		int dis = temp.get(0);// temp数组中最小的是第0位
		
		System.out.println(begin+"和"+end+"节点距离为:" + dis);
		tree.clearT();
	}
	
}

public class Tree {

	public static void main(String[] args) {
		
		//计算任意两点的距离
		MyTree tree = new MyTree();
		tree.add("世界","亚洲");
		tree.add("世界","欧洲");
		tree.add("世界","美洲");
		tree.add("亚洲","中国");
		tree.add("亚洲","日本");
		tree.add("亚洲","韩国");
		tree.add("中国","北京");
		tree.add("中国","河北");
		tree.add("中国","江苏");
		
		tree.lengthBetween(tree, "河北", "欧洲");
		tree.lengthBetween(tree, "河北", "江苏");
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值