判断一棵树是否是另外一棵树的子树。
bool DoesTree1HasTree2(BTNode* pRoot1, BTNode* pRoot2)
{
if (NULL == pRoot1)
return false;
if (NULL == pRoot2)
return true;
if (pRoot1->nData != pRoot2->nData)
return false;
// 注意这边是“&”,和下面HasSubTree最后的“||”的区别
return DoesTree1HasTree2(pRoot1->pLeft, pRoot2->pLeft) && DoesTree1HasTree2(pRoot1->pLeft, pRoot2->pRight);
}
bool HasSubTree(BTNode* pRoot1, BTNode* pRoot2)
{
if (NULL == pRoot1 && NULL == pRoot2) // 都为空
return true;
else if (NULL == pRoot1) // 只有pRoot1为空
return false;
else if (NULL == pRoot2) // 只有pRoot2为空
return true;
// 在pRoot1上找到pRoot2的根节点匹配的节点
// 从这个节点开始依次比较
if (pRoot1->nData == pRoot2->nData)
return DoesTree1HasTree2(pRoot1, pRoot2);
// 先在左子树,后右子树上查找。只要在其中一个找到即算找到
return HasSubTree(pRoot1->pLeft, pRoot2) || HasSubTree(pRoot1->pRight, pRoot2);
}
参考文献:
剑指offer