問題:尋找拓撲結構相同的子樹

對于兩棵彼此獨立的二叉樹A和B,請編寫一個高效算法,檢查A中是否存在一棵子樹與B樹的拓撲結構完全相同。
思路:前序遍歷二叉樹(或者后序,因為這樣子樹的部分會集中在一起),然后變成字符串的包含匹配問題。
因為二叉樹的遍歷序列有二義性,例如

  1. A的左孩子是B,右為空
  2. A的右孩子是B,左為空

兩者的遍歷序列是一樣的。為了消除這種情況,我們定義左右孩子為空的時候,分別在序列中添加特定的符號。

//用這種方式,在不斷遞歸的函數中增長一個字符串
void go(TreeNode* h,string& v){
        if(h){
            v+=h->val;
            if(h->left)
                go(h->left,v);
            else
                v+='-';
            if(h->right)
                go(h->right,v);
            else
                v+='+';
        }
        
    }
    bool chkIdentical(TreeNode* A, TreeNode* B) {
        string  s1,s2;
        go(A,s1);
        go(B,s2);
        //kmp函數參見《算法:KMP算法》
        int d=kmp(s1.c_str(),s2.c_str());
        return d!=-1;
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容