题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
一、初步解法
传说有很多简单解法,暂时通过的是这个。
树的先序遍历,保存在数组中,匹配数组的子串,可优化的地方,可以使用KMP算法进行匹配子串优化,实现如下:
#include <queue>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(nullptr), right(nullptr) {
}
};
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot2 == nullptr || pRoot1 == nullptr)
{
return false;
}
std::vector<TreeNode *> vec_node1;
MidForTree(pRoot1, vec_node1);
std::vector<TreeNode *> vec_node2;
MidForTree(pRoot2, vec_node2);
bool is_ture = true;
for (int i = 0; i < vec_node1.size() && vec_node1.size() - i > vec_node2.size(); i++) // 可采取KMP算法匹配子串
{
is_ture = true;
for (int j = 0; j < vec_node2.size(); j++)
{
if (vec_node2[j]->val != vec_node1[i + j]->val)
{
is_ture = false;
break;
}
}
if (is_ture)
{
break;
}
}
return is_ture;
}
void MidForTree(TreeNode *root, std::vector<TreeNode *> &vec_node)
{
if (root == nullptr)
{
return;
}
vec_node.push_back(root);
MidForTree(root->left, vec_node);
MidForTree(root->right, vec_node);
}
};
二、其他方法
待实现
bug之处在于先序遍历不能确定唯一的树。不过反向的话不知道行不行,估计是测试用例没有异型树吧,侥幸通过