题目:输入两颗二叉树A和B 判断B是不是A的子结构 二叉树结点定义如下;
首先 从树根开始遍历树
如果结点与 B的根结点值相同 则继续遍历A的左子树 以及B的左子树 如果左子树相同则遍历A的右子树以及B的左子树 如果左右子树都相同则 A包含B
如果结点与B的根节点值不同 则遍历到A的左孩子 重复上述判断做孩子是否含有B 如果左子树不含有B 则遍历到A的右子树 判断其是否含有B
因此 首先遍历A 即树的中序遍历 如果结点与B的根节点值相同 则递归遍历A中当前节点与B 各自结点是否相同
递归截止条件是达到了A或B的叶节点
struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
bool hastree(BinaryTreeNode *A,BinaryTreeNode *B)
{
bool r=false;
if(A!=NULL && B!=NULL)
{
if(A->m_nValue==B->m_nValue)
r= haschild(A,B);
if(r==false)
r=hastree(A->m_pLeft,B);
if(r==false)
r=hastree(A->m_pRight,B);
}
return r;
}
bool haschild(BinaryTreeNode *A,BinaryTreeNode *B)
{
if(B->m_nValue !=A->m_nValue)
return false; //
if(B==NULL)
return true;
<span style="font-family: Arial, Helvetica, sans-serif;"> if(A==NULL)</span>
return false;
return haschild(A->m_pLeft,B->m_pLeft) && haschild(A->m_pRight,B->m_pRight);
}