判断A树是否包含B树结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构
分析:根据数的遍历方法,首先想到的是采用递归的方式要更简单些,树A从根节点进行遍历,首先判断与B的根节点值是否相等,如果相等则进行递归遍历验证,否则验证树A的其他节点,直到所有的结点遍历完。
注意的就是指针是否为NULL,因为自己编程能力不好,所以有些很简单的也做了注释,方便以后自己理解。
//判断B是不是A的子树
struct BinaryTree{
int m_value;
BinaryTree * LeftTree;
BinaryTree * RightTree;
};
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2);
bool HasSubTree(BinaryTree * pRoot1,BinaryTree * pRoot2)
{ //当结点不相同的时候怎么去遍历其他的结点呢?
//这里采用的方法是设置一个result,当result=false时候我们并不是直接结束程序,而是继续去遍历其他点,直到所有的点都遍历完
//这里hasSubTree函数主要是为了遍历结点,而真正进行匹配是由函数DoesHasSubTree来实现
bool result=false; if(pRoot1!=NULL&&pRoot2!=NULL) //除此之外的所有情况我们都认为是不包含子树的,条件是不能丢的
{
if(pRoot1->m_value==pRoot2->m_value) //一旦查到有结点相同,就进行递归遍历进行匹配见下面函数
result=DoesHasSubTree(pRoot1,pRoot2) //这个函数式递归函数,所以在里面还需要进行判断pRoot1->m_value==pRoot2->m_value是否相等
if(!result) //遍历了根节点接下来从左子树开始遍历,(递归的作用是左子树变成根节点进行匹配。)有点类似深度优先搜索。
result=HasSubTree(pRoot1->LeftTree,pRoot2);
if(!result) //当所有左子树没有匹配到我们就开始匹配右子树,直到所有的结点遍历完。
result=HasSubTree(pRoot1->RightTree,pRoot2);
}
return result;//返回最终的结果
}
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2)
{
if(pRoot2==NULL) //当子树遍历完的标志,可以遍历完说明过程中没有碰到false条件,也就是都是匹配的
return true;
if(pRoot1==NULL)
return false; if(pRoot1->m_value!=pRoot2->m_value)
return false;
return DoesHasSubTree(pRoot1->LeftTree,pRoot2->LeftTree)&& DoesHasSubTree(pRoot1->RightTree,pRoot2->RightTree); //用&&对左右两边都进行判断
}
判断A树是否包含B树结构的更多相关文章
- [程序员代码面试指南]二叉树问题-判断t1树是否包含t2树的全部拓扑结构、[LeetCode]572. 另一个树的子树
题目1 解 先序遍历树1,判断树1以每个节点为根的子树是否包含树2的拓扑结构. 时间复杂度:O(M*N) 注意区分判断总体包含关系.和判断子树是否包含树2的函数. 代码 public class Ma ...
- 161101、在Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- 在Java中如何高效的判断数组中是否包含某个元素
原文出处: hollischuang(@Hollis_Chuang) 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Ove ...
- 在Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与
Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...
- Atitit 判断判断一张图片是否包含另一张小图片
Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2. 模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...
- Jquery判断数组中是否包含某个元素$.inArray()的用法
判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...
- PHP判断字符串中是否包含指定字符串,支持中文哦
RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...
- SQL判断字符串里不包含字母
Oracle: 方法一:通过To_Number 函数异常来判断,因为这个函数在转换不成功的时候是报错,所以只能用存储过程包装起来. CREATE OR REPLACE FUNCTION Is_Numb ...
随机推荐
- shell复习---文件解压命令
需要自己部署服务端,故在申请了空间之后,需要自己安装linux自己,自己安装Apache等,所以下载的压缩文件需要运行.网上找了一些解压命令不对,特别试了下面的方法有效,特别记录一下: 用ssh 登陆 ...
- ural 1108
大数乘法 不会java 比赛的时候各种细节RE WA ........ #include <cstdio> #include <cstring> #include ...
- MySQL在windows和linux下的表名大小写问题
MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写,结果再想要将数据库导出放到linux服务 器中使用时就出错了.因为在linux下表名区分大小写而 ...
- live555源码研究(三)------UsageEnvironment类
一.UsageEnvironment类作用 1,不使用的时候回收当前的使用环境. 2,对返回结果消息和错误消息的维护. 二.类UsageEnvironment继承关系图
- POJ3278——Catch That Cow(BFS)
Catch That Cow DescriptionFarmer John has been informed of the location of a fugitive cow and wants ...
- P90、面试题11:数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 需要注意的地方: 1)输入的指 ...
- Linux下的动态连接库及其实现机制
Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术 ...
- TextView设置样式的3种方式
1,直接在<TextView>中设置 <TextView android:id="@+id/tv_badge_view_count" android:layout ...
- PL/SQL Developer使用技巧
1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:PL/SQL ...
- UML中关系图解
转自http://blog.csdn.net/duran1986/article/details/5573415 最近在教软件工程项目实践,就又仔细了解了下UML中各种关系的意义,虽然有点简单,但是有 ...