编程练习之一颗二叉树包含另一颗二叉树
2015-06-16 21:37
417 查看
剑指offer上的一道编程练习,如何确定二叉树A包含一棵相对小一点的二叉树B?
思路:用两个函数实现,第一个首先判断根结点是否相等,第二个函数继续判断子结构是否相等
函数一:
第一步,首先从根结点入手,判断pRootA的值是否与pRootB的根结点的值是否相等。若相等,则在比较A树的子结构是否包含B数子结构,此时转入函数二;
若不相等
则转入:
第二步,递归进入函数一,判断pRootA的左子树的值是否与pRootB的根结点的值是否相等,若相等则转入函数二;
若还不相等 则转入:
第三步,递归进入函数一,判断pRootA的右子树的值是否与pRootB的根结点的值是否相等,若相等则转入函数二;
函数一代码如下:
最后。递归完成后,若左右子树中的根结点都不相等,说明A树不含有B树。
函数二:
在根结点相等的基础上,递归的判断A树的左右子树的值是否与B数的左右子树的值相等,
若是在pRootB全部遍历结束时,则说明A树含有B树,
若是在pRootA全部遍历结束时,则说明A树不含有B树。
函数二代码如下:
思路:用两个函数实现,第一个首先判断根结点是否相等,第二个函数继续判断子结构是否相等
函数一:
第一步,首先从根结点入手,判断pRootA的值是否与pRootB的根结点的值是否相等。若相等,则在比较A树的子结构是否包含B数子结构,此时转入函数二;
若不相等
则转入:
第二步,递归进入函数一,判断pRootA的左子树的值是否与pRootB的根结点的值是否相等,若相等则转入函数二;
若还不相等 则转入:
第三步,递归进入函数一,判断pRootA的右子树的值是否与pRootB的根结点的值是否相等,若相等则转入函数二;
函数一代码如下:
bool HasSubTree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { bool result = false; if (pRoot1 != NULL&&pRoot2 != NULL) { if (pRoot1->m_value == pRoot2->m_value) result = DoseTree1HasTree2(pRoot1, pRoot2); if (!result) result = HasSubTree(pRoot1->m_pLeft, pRoot2);//if not,turn to left tree to find; if (!result) result = HasSubTree(pRoot1->m_pRight, pRoot2);//if not again,turn to right tree to find; } }
最后。递归完成后,若左右子树中的根结点都不相等,说明A树不含有B树。
函数二:
在根结点相等的基础上,递归的判断A树的左右子树的值是否与B数的左右子树的值相等,
若是在pRootB全部遍历结束时,则说明A树含有B树,
若是在pRootA全部遍历结束时,则说明A树不含有B树。
函数二代码如下:
bool DoseTree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) { if (pRoot2 == NULL) //if all of Tree2 has been traced,so that we find Tree1 has had Tree2 return true; if (pRoot1 == NULL) return false; //if all of Tree1 has been traced,so that we find Tree1 has not had Tree2 return DoseTree1HasTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) && DoseTree1HasTree2(pRoot1->m_pRight, pRoot2->m_pRight); }
相关文章推荐
- C++ Virtual介绍
- java图片居中裁剪
- C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏
- Eclipse:open output file blabla.exe: Permission denied
- Ruby on Rails学习心得(三)数据库基本操作
- 用 xampp 在ubuntu 下配置php 运行环境 lampp
- java贪吃蛇游戏
- C# DataTable详细用法
- Java泛型代码例子
- java中的正则表达式
- FreeGLUT Tips: Resolve compile error C2664: cannot convert argument 2 from '_TCHAR *[]' to 'char **'
- C语言和Fortran语言的差异
- java俄罗斯方块
- java中的数字格式化
- 使用Spring Boot快速构建应用
- [尚硅谷] 尚硅谷技术文档——Struts2 面试题分析
- 安装与配置JDK
- 迷宫的最短路径 代码(C++)
- javascrpt监听窗口关闭
- java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind