给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
具体题目:
此题可以从父子节点来入手,当然首先得判断节点数量是否一致。
其次可以判断每棵树节点的子节点或每棵树节点的父节点来比较(通俗一点来说就是,这两棵树中,任意节点的父节点或子节点都需要一致)
以下是代码以子节点为例,思路是,先遍历第一个list,获取字母“A”,同时找到子节点字母“B”,“C”;然后在list2中找到字母“A”,同样也找到子节点。比较是否一致
如此循环,若所有节点的子节点都一致,则说明是同一个棵树
public static Boolean t2() {
List<String> list = new ArrayList<>();
list.add("A 1 2");
list.add("B 3 4");
list.add("C 5 -");
list.add("D - -");
list.add("E 6 -");
list.add("G 7 -");
list.add("F - -");
list.add("H - -");
List<String> list2 = new ArrayList<>();
list2.add("G - 4");
list2.add("B 7 6");
list2.add("F - -");
list2.add("A 5 1");
list2.add("H - -");
list2.add("C 0 -");
list2.add("D - -");
list2.add("E 2 -");
// 遍历第一个数组
for (String s : list) {
String[] split = s.split(" ");
String[] child = new String[]{"-","-"};
// 在第一个数组中,获取对应的子节点
if (!split[1].equals("-")) {
child[0] = list.get(Integer.parseInt(split[1])).split(" ")[0];
}
if (!split[2].equals("-")) {
child[1] = list.get(Integer.parseInt(split[2])).split(" ")[0];
}
// 在第二个数组中找到当前字母,然后在获取他的子节点字母
String[] child2 = getChild(split[0], list2);
Arrays.sort(child);
Arrays.sort(child2);
// 比较子节点是否一致
if (!child2.equals(child2)) {
return false;
}
}
return true;
}
/**
* 获取子节点
*/
private static String[] getChild(String letter, List<String> list) {
String[] strings = new String[]{"-","-"};
for (String s : list) {
if (s.split(" ")[0].equals(letter)) {
if (!s.split(" ")[1].equals("-")) {
strings[0] = list.get(Integer.parseInt(s.split(" ")[1])).split(" ")[0];
}
if (!s.split(" ")[2].equals("-")) {
strings[1] = list.get(Integer.parseInt(s.split(" ")[2])).split(" ")[0];
}
}
}
return strings;
}