跟Symmetric Tree思路一样,使用Map保存节点,key是节点在所在层索引,value是节点TreeNode.
package leetcode;
import java.util.HashMap;
import java.util.Map;
public class SameTree {
/**
* @param args
*/
public static void main(String[] args) {
TreeNode node = new TreeNode(0);
//node.left = new TreeNode(2);
//node.right = new TreeNode(2);
TreeNode node2 = new TreeNode(1);
//node2.left = new TreeNode(2);
SameTree s = new SameTree();
System.out.println(s.isSameTree(node, node2));
}
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q != null) {
return false;
}
if (p != null && q == null) {
return false;
}
if (p == null && q == null) {
return true;
}
if (p.val != q.val ) {
return false;
}
Map<Integer, TreeNode> father1 = new HashMap<Integer, TreeNode>();
Map<Integer, TreeNode> child1 = new HashMap<Integer, TreeNode>();
father1.put(0, p);
Map<Integer, TreeNode> father2 = new HashMap<Integer, TreeNode>();
Map<Integer, TreeNode> child2 = new HashMap<Integer, TreeNode>();
father2.put(0, q);
while (true) {
child1.clear();
for (Integer key : father1.keySet()) {
TreeNode node = father1.get(key);
if (node.left != null) {
child1.put(key * 2 + 0, node.left);
}
if (node.right != null) {
child1.put(key * 2 + 1, node.right);
}
}
child2.clear();
for (Integer key : father2.keySet()) {
TreeNode node = father2.get(key);
if (node.left != null) {
child2.put(key * 2 + 0, node.left);
}
if (node.right != null) {
child2.put(key * 2 + 1, node.right);
}
}
if (child1.isEmpty() && child2.isEmpty()) {
break;
} else {
if (child1.isEmpty() && !child2.isEmpty()) {
return false;
} else if (!child1.isEmpty() && child2.isEmpty()) {
return false;
}
}
for (Integer index : child1.keySet()) {
TreeNode node1 = child1.get(index);
TreeNode node2 = child2.get(index);
if (node2 == null || node2.val != node1.val) {
return false;
}
}
Map<Integer, TreeNode> temp = father1;
father1 = child1;
child1 = temp;
temp = father2;
father2 = child2;
child2 = temp;
}
return true;
}
}