您的位置:首页 > 职场人生

【面试题】剑指Offer-18-判断一颗树是否为另一颗树的子树

2017-04-06 11:40 561 查看

题目概述



解题思路

这里用到递归的思想

先递归【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐