572. Subtree of Another Tree
判断一棵树是否为另外一颗树的子树。
1、最开始的思路就是比较每个节点,判断其对应的树是不是和另外一棵树相等。那如何去比较每个点呢。一开始没想出来,其实就是写一个tranverse函数,每次判断当前节点耳朵树,以及其左子树,以及其右子树,用或连接,递归。
//对每一个节点都求一次,两棵树是不是相等
class Solution {
public:
bool isSubtree(TreeNode* s, TreeNode* t) {
return tranverse(s,t);
}
bool tranverse(TreeNode*s,TreeNode*t){
return (s!=nullptr)&& (equals(s,t)||tranverse(s->left,t)||tranverse(s->right,t));
}
bool equals(TreeNode*s, TreeNode*t)
{
if(s==nullptr&&t==nullptr)
return true;
if(s==nullptr||t==nullptr)
return false;
return (s->val==t->val) && equals(s->left,t->left) && equals(s->right,t->right);
}
};
2、前序遍历写出两棵树的字符串,判断是不是子字符串。但是要注意几种问题,null要写成lnull和rightnull;不同节点开始用#隔开,防止这种情况
23 3 4和3 3 4
*/
//用前序遍历写出来,判断是不是子字符串。
class Solution {
public:
bool isSubtree(TreeNode* s, TreeNode* t) {
if(s==nullptr&&t==nullptr)
return true;
if(s==nullptr||t==nullptr)
return false;
string Sstring=pre(s,true);
string Tstring=pre(t,true);
bool flag=false;
if(Sstring.find(Tstring)!=-1)
flag=true;
return flag;
}
string pre(TreeNode *s,bool leftflag)
{
if(s==nullptr)
{
if(leftflag)
return "lnull";
else
return "rnull";
}
return "#"+to_string(s->val)+" "+pre(s->left,1)+" "+pre(s->right,0);
}
};