输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
1 判断A B根节点是否相等,若相等,判断A B左右子树是否是 父子结构关系 若都成立 返回true
2 若不相等,那么递归到A的左右子树 判断B是不是A的子树的子结构
树结构:
truct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
核心函数 hastree
注意该函数仅仅判断 root1 root2根节点匹配情况
bool hastree(TreeNode* root1,TreeNode* root2)
{
if(root2==NULL) //root2已经遍历完,root1可能还有剩余,那么包含该子结构
return true;
if(root1==NULL) //root1已经遍历完,root2可能还有剩余,那么不包含该子结构
return false;
if(root1->val!=root2->val) //根节点的值都不相同 肯定不包含
return false;
else
return (hastree(root1->left,root2->left))&&(hastree(root1->right,root2-
>right)); //一般情况下需要向下递归
}
主函数 HasSubtree 判断pRoot1是否包含pRoo2子结构
采用递归思路
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1!=NULL && pRoot2!=NULL) //仅在2个节点都不为空情况下分析
{
if(hastree(pRoot1,pRoot2)) //先判断根节点是否 可以包含子树
return true;
if(HasSubtree(pRoot1->left,pRoot2)) //否则递归到判断左右子树是否包含子结构
return true;
if(HasSubtree(pRoot1->right,pRoot2))
return true;
}
return false;
}