演算法題:二叉樹A是否包含二叉樹B的拓撲結構
阿新 • • 發佈:2019-01-22
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;