给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
我最开始的思路是中序遍历两个树,依次放入两个个vector res temp 里面,然后看temp 是否在res里面,在的话返回true,不在的话返回false.但是这种思路有种致命的错误:就是第二张图返回的是false;
所以我就有了第二种思路:在S树里前序遍历找到所有含有T树根节点值的节点,然后将这些节点值利用中序遍历返回到一个二维数组里。
最后中序遍历T树,将此树放入一个vector里面,然后看二维数组里是否含有这个一维数组就行。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
static auto x = [](){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
return 0;
}();
class Solution {
public:
void zhong (TreeNode *root){
if(root==NULL) return;
zhong(root->left);
res.push_back(root->val);
zhong(root->right);
}
void zhongxu(TreeNode *root,int s){
if(root==NULL) return;
if(root->val==s){
zhong(root);
rl.push_back(res);
res.clear();
}
zhongxu(root->left,s);
zhongxu(root->right,s);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if(t==NULL) return true;
if(s==NULL) return false;
zhong(t);
temp=res;
res.clear();
zhongxu(s,t->val);
int m=rl.size();
for(int i=0;i<m;i++){
if(temp==rl[i]){
return true;
}
}
return false;
}
private:
vector<int> temp;
vector<int> res;
vector<vector<int>> rl;
};
最后附上AC
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
static auto x = [](){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
return 0;
}();
class Solution {
public:
bool isSubtree(TreeNode* s, TreeNode* t) {
if (s == NULL) 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;
return isSame(s->left, t->left) && isSame(s->right, t->right);
}
};