判斷一棵樹中是否包含另外一棵子樹(包含是,兩棵樹重合處的根節點之下的子節點都相等)html
有兩種方法:node
方法二:遞歸寫法spa
//方法一:能夠借鑑以前序列化的題目,若是序列化獲得的序列同樣就是相同的樹 //方法二:用遞歸來寫十分的簡潔,咱們先從s的根結點開始,跟t比較,若是兩棵樹徹底相同,那麼返回true,不然就分別對s的左子結點和右子結點調用遞歸再次來判斷是否相同,只要有一個返回true了,就表示能夠找獲得。
class Solution { public: bool isSubtree(TreeNode* s, TreeNode* t) { //方法二的遞歸
if (!s) return false; if (isSame(s,t)) return true; return isSubtree(s->left,t) || isSubtree(s->right,t); } bool isSame(TreeNode* s,TreeNode* t){//這是一個子題,判斷兩個樹是否相等
if (s == NULL && t == NULL) return true; if (s == NULL || t == NULL) return false; if (s->val != t->val) return false; if (s->val == t->val) return isSame(s->left,t->left) && isSame(s->right,t->right); } };
方法一:比較兩個字符串code
//寫成兩個序列,判斷一個序列是否包含另外一個序列爲子序列
class Solution { public: bool isSubtree(TreeNode* s, TreeNode* t) { ostringstream os1, os2; serialize(s, os1); serialize(t, os2); return os1.str().find(os2.str()) != string::npos; } void serialize(TreeNode* node, ostringstream& os) { if (!node) os << ",#"; else { os << "," << node->val; serialize(node->left, os); serialize(node->right, os); } } };
https://www.cnblogs.com/zfyouxi/p/4074592.htmlhtm
介紹ostringstream.blog