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

关于剑指offer的阅读笔记 之面试题18 树的子结构细节错误

2016-06-21 22:29 495 查看
剑指offer面试题18  输入两棵二叉树A和B ,判断B是不是A的子树  

思路:查找可以分为两步,第一步在A中找和B根结点值一样的根节点R,第二步 判断a中以R为根节点的子树是不是包含和树B一样的结构。  树的遍历我们采用递归,看过书之后自己写出如下代码:

第一步的代码:

bool HasSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
{
bool result = false;
if ( pRoot1 != NULL && pRoot2 != NULL)
{
if (pRoot1->m_nValue == pRoot2->m_nValue)
{
result = DoesTree1HaveTree2(pRoot1,pRoot2);
}
if (!result)
{
result = HasSubtree(pRoot1->m_pLeft,pRoot2);
}
if ( !result)
{
result = HasSubtree(pRoot1->m_pRight,pRoot2);
}
}
return result;
}第二步的代码:
bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if (pRoot2 == NULL)
{
return true;
}
if (pRoot1 == NULL)
{
return false; // 这里两个if判断不可以换顺序,当1和2匹配到叶子结点时,如果先判断2在判为失败,其实应该为成功
}
if ( pRoot1->m_nValue != pRoot2->m_nValue)
{
return false;
}
return DoesTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft) &&
DoesTree1HaveTree2(pRoot1->m_pRight,pRoot2->m_pRight);
}测试之后发现部分匹配失败,部分匹配成功,检查发现问题出现在
DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)函数中前面来个判断语句,两个判断语句并不是完全平行的,原来的当两棵树匹配的叶子结点结构相同的时候,如果先判断树A则返回false,其实此时B书已经匹配完成,应该返回true。所以应该先判断b树是否已经达到叶子结点,而不应该先判断A树。
完成的工程可以私信我要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息