题目:有两个二叉树,判断第二个树是不是第一个树的子树,即第二个树是不是第一个树的一部分。如图所示:红色标记中的部分就是第二棵树。
#include<iostream>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(char x)
:val(x), left(NULL), right(NULL)
{}
};
class Solution {
public:
Solution()
{
root1 = NULL;
root2 = NULL;
}
Solution(char *str1,char *str2)
{
_CreateTree(root1, str1);
_CreateTree(root2, str2);
}
bool HasSubtree()
{
bool res = _HasSubtree(root1, root2);
return res;
}
private:
bool _HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool res = false;
if (pRoot1 != NULL && pRoot1 != NULL)
{
if(pRoot1->val == pRoot2->val)
{
res = _DoseTree1HaveTree2(pRoot1, pRoot2);
}
if (!res)
res = _HasSubtree(pRoot1->left, pRoot2);
if (!res)
res = _HasSubtree(pRoot1->right, pRoot2);
}
return res;
}
bool _DoseTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot2 == NULL) //子树已遍历完毕,必须放前面
return true;
if (pRoot1 == NULL) //没有找到子树
return false;
if (pRoot1->val != pRoot2->val)
return false;
return _DoseTree1HaveTree2(pRoot1->left, pRoot2->left) && _DoseTree1HaveTree2(pRoot1->right, pRoot2->right);
}
void _CreateTree(TreeNode *& root, char*& str) //创建节点
{
if (*str != '#' && *str != '\0')
{
root = new TreeNode(*str);
_CreateTree(root->left, ++str);
_CreateTree(root->right, ++str);
}
}
private:
struct TreeNode *root1;
struct TreeNode *root2;
};
int main()
{
char *str1 = "889##24##7##7##";
char *str2 = "89##24##7##";
Solution Tree(str1,str2);
Tree.HasSubtree();
getchar();
return 0;
}