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