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

如果定义一颗二叉树的高度就是从根到叶子的最长距离。试编码求二叉树的高度。
其实,二叉树的高度就是它的左子树和右子树中高度最大值 + 1
另外考虑: 当待排序的数据本来就是有序的情况,会发生什么?

请参考《数据结构》教材解决这个问题。

import java.util.ArrayList;
import java.util.List;

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

	// 得到所有孩子
	public List<String> getChild(String x) {
		List<String> t = new ArrayList<String>();
		for (int i = 0; i < lst.size(); i++) {
			if (lst.get(i).parent.equals(x)) {
				t.add(lst.get(i).data);
			}
		}
		return t;
	}

	List<String> t = new ArrayList<String>();

	// 用递归,得到所有父节点,存入数组t中。
	public String getParent(String x) {
		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();
	}

	/*
	 * 没有在这个类中实现成功,但是在主函数中实现了,看了很久也没看出问题, 
	 * debug时我建立的两个临时数组竟然没有接受到数据,
	 * 我查了很久也不知道原因,回头再研究 
	 * 总之,在主函数中还是把问题解决了
	 */
	// public void length(String a, String b) {
	// List<String> aa = new ArrayList<String>();
	// List<String> bb = new ArrayList<String>();
	// MyTree my = new MyTree();
	//
	// my.getParent(a);
	// for (int i = 0; i < my.t.size(); i++) {
	// aa.add(my.t.get(i));
	// }
	// my.clearT();
	// my.getParent(b);
	// for (int i = 0; i < my.t.size(); i++) {
	// aa.add(my.t.get(i));
	// }
	//
	// for (int i = 0; i < aa.size(); i++) {
	// for (int j = 0; j < bb.size(); j++) {
	// if (aa.get(i).equals(bb.get(j))) {
	// System.out.println("节点距离为:" + (i + 1 + j + 1));
	// }
	// }
	// }
	// }
	// 得到所有父节点
}

public class MyTreeTest {
	public static void main(String[] args) {
		MyTree a = new MyTree();
		a.add("世界", "亚洲");
		a.add("世界", "欧洲");
		a.add("世界", "美洲");
		a.add("亚洲", "中国");
		a.add("亚洲", "日本");
		a.add("亚洲", "韩国");
		a.add("中国", "北京");
		a.add("中国", "河北");
		a.add("中国", "江苏");

		List<String> aa = new ArrayList<String>();
		List<String> bb = new ArrayList<String>();
		a.getParent("河北");
		for (int i = 0; i < a.t.size(); i++) {
			aa.add(a.t.get(i));
		}
		a.clearT();// 清空列表
		a.getParent("北京");
		for (int i = 0; i < a.t.size(); i++) {
			bb.add(a.t.get(i));
		}
		List<Integer> temp = new ArrayList<Integer>();
		for (int i = 0; i < aa.size(); i++) {
			for (int j = 0; j < bb.size(); j++) {
				if (aa.get(i).equals(bb.get(j))) {
					temp.add(i + j + 2);// 如果有多条路径,放入temp中
				}
			}
		}
		int dis = temp.get(0);// temp数组中最小的是第0位
		System.out.println("节点距离为:" + dis);
	}
}
Conclusion
节点距离为:2




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值