/* 题目: 输入两棵二叉树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; }