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