1. 程式人生 > >演算法題:二叉樹A是否包含二叉樹B的拓撲結構

演算法題:二叉樹A是否包含二叉樹B的拓撲結構

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;