题目:
输入两颗二叉树A,B, 判断B是否为A的子结构(注意约定空树不是任意一颗树的子结构)
解法:
1、遍历A树节点,寻找节点值和B树根节点值相同的节点。
2、对于步骤1中寻找的节点,判断以该节点为根的子树 是否存在和B一样的子树结构。
3、注意异常输入 和NULL 的判断
代码如下:
bool HasSubtree(TreeNode* A, TreeNode* B)
{
bool res = false;
//前序遍历节点
if(A!=NULL && B!=NULL)
{
if(A->val == B->val )
res = DoesTree1HaveTree2(A,B);
if(res == false)
res = HasSubtree(A->left,B);
if(res == false)
res =HasSubtree(A->right,B);
}
return res;
}
bool DoesTree1HaveTree2(TreeNode* A, TreeNode* B)
{
if(B==NULL)
return true;
if(A==NULL )
return false;
/* 注意此处 如果把A的判断写在前面 要加上B!=NULL 的判断,该函数只有在判断B不是空树时候才执行
if(A==NULL & B!=NULL) 因此此处在B==NULL时候 要返回TRUE,因为B已经判断不为空树了,其子树可能为空树,
return false; 此时的子树为空树情况应该属于A的子结构
if(B==NULL )
return true;
*/
if(A->val != B ->val)
return false;
return DoesTree1HaveTree2(A->left,B->left) && DoesTree1HaveTree2(A->right,B->right);
}