572. Subtree of Another Tree(另一个树的子树)

给定两个非空二叉树 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);
    }
};

猜你喜欢

转载自blog.csdn.net/Viewz/article/details/80976713