【剑指offer】二叉树的子结构,C++实现(递归)
原创博文,转载请注明出处!
1.题目
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:约定空树不是任意一个树的子结构)

图1.二叉树A和二叉树B
2.思路(递归)
查找二叉树B是否是二叉树A的子结构,可以分为两步:
第一步,递归遍历树A,在树A中找到和树B的根节点的值一样的节点R。递归出口是遍历完二叉树A或在树A中找到和树B结构一样的子树。
- 树A为空的时候,输出false
- 树B为空的时候,输出false
第二步,递归遍历树A的子树,判断树A中以R为根节点的子树是不是包含和树B一样的结构。递归出口是到达树A或者树B的叶节点。
- 如果树B的指针为空,则返回true
- 如果树B的指针不为空,而树A的指针为空,则返回false

图2.树A的根节点和树B的根节点的值相同,但树A的根节点下面的结构和树B的结构不一致

图3.在树A中找到第二个值为8的节点,该节点存在和B的结构一样的子树
3.代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
// 递归出口
if(!pRoot1||!pRoot2)
return false; return ( dfs(pRoot1,pRoot2)) || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
}
private:
bool dfs(TreeNode * r1, TreeNode * r2)
{
// 递归出口
if(!r2)
return true; // 递归出口
if(!r1)
return false; // 递归出口
if(r1->val != r2->val)
return false;
else
return dfs(r1->left, r2->left) && dfs(r1->right, r2->right);
}
};
4.测试用例
# 边界测试
- 树A的头结点是空指针
- 树B的头结点是空指针
- 树A和树B的头结点是空指针
- 树A和树B只有左子节点或右子节点
# 功能测试
- 普通二叉树,树B是树A的子结构
- 普通二叉树,树B不是树A的子结构
【剑指offer】二叉树的子结构,C++实现(递归)的更多相关文章
- 剑指Offer——二叉树
		剑指Offer--二叉树 前言 数据结构通常是编程面试中考察的重点.在参加面试之前,应聘者需要熟练掌握链表.树.栈.队列和哈希表等数据结构,以及它们的操作.本片博文主要讲解二叉树操作的相关知识,主要包 ... 
- JS数据结构与算法 - 剑指offer二叉树算法题汇总
		❗❗ 必看经验 在博主刷题期间,基本上是碰到一道二叉树就不会碰到一道就不会,有时候一个下午都在搞一道题,看别人解题思路就算能看懂,自己写就呵呵了.一气之下不刷了,改而先去把二叉树的基础算法给搞搞懂,然 ... 
- 剑指offer 二叉树中和为某一个值的路径
		剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ... 
- 剑指offer 二叉树的层序遍历
		剑指offer 牛客网 二叉树的层序遍历 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 09:33:16 2019 @ ... 
- 剑指 Offer 64. 求1+2+…+n + 递归
		剑指 Offer 64. 求1+2+-+n Offer_64 题目描述 题解分析 使用&&逻辑短路规则来终止循环 package com.walegarrett.offer; /** ... 
- 剑指 Offer 12. 矩阵中的路径 + 递归 + 深搜 + 字符串问题
		剑指 Offer 12. 矩阵中的路径 题目链接 题目类似于迷宫的搜索. 需要注意的是,需要首先判断起始搜索的位置,可能有多个起点,都需要一一尝试. 每轮迭代的时候记得将是否遍历标记数组还原为未遍历的 ... 
- [剑指Offer]26-树的子结构
		题意 判断一棵树(参数二)是不是另一棵树(参数一)的子结构. 题解 递归第一棵树,找两棵树中值一样的节点.若找到后,用另一个函数判断以相同值得节点为根的树2是不是树1的子结构. 代码 class Tr ... 
- 剑指offer——树的子结构 (JAVA代码)
		版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ... 
- 剑指Offer 树的子结构
		题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分为2个部分.1先找出A中和B根节点相同的节点r. 2,咱判断B中所有孩子节点是不 ... 
- 剑指offer——二叉树的镜像
		题目:操作给定的二叉树,将其变换为源二叉树的镜像. 思路:前序(根左右的顺序)遍历一棵树,在存储的时候将其左右树进行交换,最后按照处理后的树还原,即得到其镜像. /** public class Tr ... 
随机推荐
- close与shutdown系统调用
			使用多线程时,pthread_create的参数flag有CLONE_FILES, 最终调用do_fork(),并且会根据CLONE_FILES标志来调用copy_files()来共享父进程中的文件描 ... 
- mysql悲观锁以及乐观锁总结和实践
			悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实现,往往 ... 
- 退出Vi(m)
			按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :wq 保存文件并退出vi :wq! 强制保存文件, ... 
- Linux 安装rabbitmq 遇到的一些问题
			Linux下防火墙开启相关端口及查看已开启端口 https://www.cnblogs.com/pizitai/p/6518987.htmlhttps://www.cnblogs.com/blog-y ... 
- 面试笔试总结(一)之 C++基础
			C++ 1.智能指针 内存管理 垃圾回收 指针问题 资源管理(内存就是资源) 可以通过引用计数的机制...实现内存回收,不要让内存泄漏. 涉及到内存的泄露的问题: 当创建一个对象的时候(new)而在对 ... 
- 如何优雅地使用 rm 防止误删除?
			IT 界的有一个老梗,一次某论坛的数据库管理员抱怨自己老板一直虐待他,结果他一气之下就删库跑路了...... 于是... 据新华社北京 8 月 20 日电 ,北京一软件工程师徐某离职后因公司未能如期结 ... 
- 用svg实现不规则形状
			像这种弧形,用纯html和css很难写,但是用svg就简单多了. 可以用作图工具画出一个弧形,然后导成svg格式.在页面中,下面的白块就是div+svg构成 mixin svgCard(...cont ... 
- 【Linux】无法添加用户,报“useradd: cannot open /etc/passwd”问题解决过程记录
			问题描述 今天在一个新的Linux环境添加用户的时候,发现不能添加,遇到了以下错误 useradd: cannot open /etc/passwd 解决方法 用lsattr命令查看/etc/pass ... 
- UVALive - 6712 lca+dfs序线段树
			题意:一棵树q次查询,每次查询给三个不同的点,要求计算到这三个点的比其他两个距离都要小的点数 题解:很明显的lca,倍增的找中点,关键是两个点的中点很好找,但是三个点不好找,我刚开始还准备分类讨论,后 ... 
- day24  Restful api 设计和CRM 客户关系管理
			博客: Restful: http://www.cnblogs.com/alex3714/articles/6808013.html http://www.cnblogs.com/alex3714/a ... 
