/*
题目:
输入两棵二叉树A和B,判断B是不是A的子树。
*/
/*
思路:
1、注意浮点数大小的判断。
2、判断树A的某个节点是否和树B的根节点是否相同,
若相同,则判断以A该节点为根节点是否包含树B;
若不包含,判断A的左子树是否包含树B;
若不包含,判断A的右子树是否包含树B。
3、以A的某个节点为根,判断是否对应B的根节点,
判断A的左子树和B的左子树的相等性;判断A的右子树和B的右子树的相等性。
*/
#include <iostream>
#include<cstdlib>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
bool equals(double num1, double num2){
if(num1-num2 > -0.0000001 && num1-num2 < 0.0000001){
return true;
}
return false;
}
bool doesHasSubtree(TreeNode* pNode1,TreeNode* pNode2){
if(pNode2 == nullptr) return true;
if(pNode1 == nullptr) return false;
if(equals(pNode1->val,pNode2->val)){
return doesHasSubtree(pNode1->left,pNode2->left) && doesHasSubtree(pNode1->right,pNode2->right);
}
return false;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result = false;
if(pRoot1 != nullptr && pRoot2 != nullptr){
if(equals(pRoot1->val,pRoot2->val)){
result = doesHasSubtree(pRoot1,pRoot2);
}
if(!result){
result = HasSubtree(pRoot1->left,pRoot2);
}
if(!result){
result = HasSubtree(pRoot1->right,pRoot2);
}
}
return result;
}
int main()
{
TreeNode *node7 = new TreeNode(7);
TreeNode *node6 = new TreeNode(4);
TreeNode *node5 = new TreeNode(3);
TreeNode *node4 = new TreeNode(9);
TreeNode *node3 = new TreeNode(7);
TreeNode *node2 = new TreeNode(8);
TreeNode *node1 = new TreeNode(8);
node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->right = node5;
node5->left = node6;
node5->right =node7;
TreeNode *node31 = new TreeNode(2);
TreeNode *node21 = new TreeNode(9);
TreeNode *node11 = new TreeNode(8);
node11->left = node21;
node11->right = node31;
cout<<HasSubtree(node1,node11)<<endl;
return 0;
}