题目:输入两个树A和B,判断B是不是A的子结构。
class TreeNode //树结点
{
public:
int val;
TreeNode* lptr;
TreeNode* rptr;
TreeNode(int x)
{
val = x;
lptr = NULL;
rptr = NULL;
}
};
bool doesTreeAhasTreeB(TreeNode* root1, TreeNode* root2)
{
if (root2 == NULL)return true;
if (root1 == NULL)return false;
if (root1->val != root2->val)return false;
return doesTreeAhasTreeB(root1->lptr, root2->lptr) && doesTreeAhasTreeB(root1->rptr, root2->rptr);
}
bool hasSubtree(TreeNode* A, TreeNode* B)
{
bool res = false;
if (A !=NULL && B !=NULL)
{
if (A->val == B->val)
res= doesTreeAhasTreeB(A, B);
if (!res)
res = hasSubtree(A->lptr, B);
if (!res)
res = hasSubtree(A->rptr, B);
}
return res;
}
int main()
{
TreeNode* p = new TreeNode(8); //建立树 p
p->lptr = new TreeNode(8);
p->rptr = new TreeNode(7);
TreeNode* lr = p->lptr;
lr->lptr = new TreeNode(9);
lr->rptr = new TreeNode(2);
lr = lr->rptr;
lr->lptr = new TreeNode(4);
lr->rptr = new TreeNode(7);
//TreeNode* q = new TreeNode(8); //测试样例 1
//q->lptr = new TreeNode(9);
//q->rptr = new TreeNode(2);
TreeNode* q = NULL; //测试样例 2
if (hasSubtree(p, q))cout << "p hasSubtree q" << endl;
else cout<< "p not has Subtree" << endl;
return 0;
}