题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void preVisit(TreeNode* root, vector<int>& array)
{
if(!root)
return;
array.push_back(root->val);
preVisit(root->left,array);
preVisit(root->right,array);
}
void midVisit(TreeNode* root, vector<int>& array)
{
if(!root)
return;
midVisit(root->left,array);
array.push_back(root->val);
midVisit(root->right,array);
}
bool son(vector<int> array1, vector<int> array2)
{
for(int i = 0;i<(array1.size()-array2.size());i++)
{
if(array1[i] == array2[0])
{
int num=0;
for(int j = 0;j<array2.size();j++)
{
if(array1[i+j] != array2[j])
break;
else
num++;
}
if(num == array2.size())
return true;
}
}
return false;
}
bool HasSubtree(TreeNode* left, TreeNode* right)
{
if(!left||!right)
return false;
vector<int> preLeft;
preVisit(left,preLeft);
vector<int> preRight;
preVisit(right,preRight);
vector<int> midLeft;
preVisit(left,midLeft);
vector<int> midRight;
preVisit(right,midRight);
bool flag = son(preLeft, preRight);
if(flag)
{
bool temp = son(midLeft,midRight);
if(temp)
return true;
}
return false;
} //判断二颗树的前序和中序遍历是否为子集
};