关于剑指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树。
完成的工程可以私信我要。
思路:查找可以分为两步,第一步在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树。
完成的工程可以私信我要。
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- AVL树-自平衡二叉查找树(Java实现)
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法