版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daaikuaichuan/article/details/84899019
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路:
对A和B分别使用先序遍历和中序遍历,若两种遍历方式,A的序列都包含【包含不一定非要是连续子串】B,则B是A的子结构。
Demo:
class Solution {
public:
string str1;
string str11;
string str2;
string str21;
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot2 == nullptr)
return false;
preorder(pRoot1, str1);
preorder(pRoot2, str2);
inorder(pRoot1, str11);
inorder(pRoot2, str21);
// 同时满足先序遍历包含和中序遍历包含则符合要求
if (isequal(str1, str2) && isequal(str11, str21))
return true;
else
return false;
}
// 判断一个字符串是否包含另一个子串(不一定是连续)
bool isequal(string str1, string str2)
{
int i = 0, j = 0;
int sz1 = str1.size();
int sz2 = str2.size();
while (i < sz1 && j < sz2){
if (str2[j] == str1[i])
j++;
i++;
}
if (j == sz2)
return true;
else
return false;
}
// 先序遍历
void preorder(TreeNode *ptr, string &str)
{
if (ptr != nullptr){
str.append(to_string(ptr->val));
preorder(ptr->left, str);
preorder(ptr->right, str);
}
}
// 中序遍历
void inorder(TreeNode *ptr, string &str)
{
if (ptr != nullptr){
inorder(ptr->left, str);
str.append(to_string(ptr->val));
inorder(ptr->right, str);
}
}
};