1. 题目
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class IdenticalTree {
public boolean chkIdentical(TreeNode A, TreeNode B) {
//write code here
}
}
2.思路
剑指Offer—面试题18:树的子结构这个题目跟上述类似,但是在刷题时候,碰到了一种情况。
按层次遍历TreeA{1,2,3,4,5,6,7}
按层次遍历TreeB{1}
这两的两棵树,TreeB是TreeA的拓扑结构吗?
答案是false
;
为什么这么说?我也是想了一阵子才想明白:
TreeB的根节点为1,左孩子为null,右孩子为null;
TreeA的1左孩子为2,右孩子为3;
恍然大悟。
提供另外一种思路:
1. 利用前序遍历,将TreeA序列化为字符串stra,将TreeB序列化为字符换strb.
2. 其中TreeNode!=null
时,序列化为val+"!"
,TreeNode==null
时,序列化为"@!"
3. 最后返回的是stra.contains(strb);
3.代码
public boolean chkIdentical(TreeNode A, TreeNode B) {
// write code here
String stra=preSerial(A);
String strb=preSerial(B);
return stra.contains(strb);
}
public String preSerial(TreeNode node){
StringBuilder sb=new StringBuilder();
if(node==null){
return "@!";
}
sb.append(node.val+"!");
sb.append(preSerial(node.left));
sb.append(preSerial(node.right));
return sb.toString();
}
4.感想
碰到这个题目,还是需要问清楚,TreeA{1,2,3,4,5,6,7},TreeB{1}这种情况下返回的是true还是false;