题目概述
解题思路
这里用到递归的思想
先递归【HasSubTree】找到和子树相同值的节点
然后再用另一个递归函数【DoseTree1HasTree2】判断是否相等
如果遍历到SubT子树的叶子结点,则匹配成功
如果SrcT为空,则匹配没有成功
如果都存在,则判断左子树和右子树
根据左子树和右子树的返回结果判断此时是否完全匹配
如果不匹配,则继续【HasSubTree】找值相同的节点
代码实现
bool DoesTree1HasTree2(const TreeNode* srcT, const TreeNode* subT)
{
//如果子树到了叶子节点,表示成功
if (subT == NULL)
return true;
//表示没有匹配成功
if (srcT == NULL)
return false;
bool retLeft = DoesTree1HasTree2(srcT->_left, subT->_left);
bool retRight = DoesTree1HasTree2(srcT->_right, subT->_right);
return retLeft && retRight;
}
bool HasSubTree(const TreeNode* srcT, const TreeNode* subT)
{
if (subT == NULL)
return false;
bool ret = false;
if (srcT != NULL)
{
if (srcT->_data == subT->_data)
{
ret = DoesTree1HasTree2(srcT, subT);
}
if (!ret)
ret = HasSubTree(srcT->_left, subT);
if (!ret)
ret = HasSubTree(srcT->_right, subT);
}
return ret;
}