剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
1 题目描述
2 思路和方法
(1)先在A中找和B的根节点相同的结点
(2)找到之后遍历对应位置的其他结点,直到B中结点遍历完,都相同时,则B是A的子树
(3)对应位置的结点不相同时,退出继续在A中寻找和B的根节点相同的结点,重复步骤,直到有任何一棵二叉树为空退出
3 C++核心代码
3.1 递归实现1
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
//1.先找到和子树根节点相同的结点
bool flag=false;
if((pRoot1!=NULL)&&(pRoot2!=NULL))
{
if(pRoot1->val==pRoot2->val)
//开始判断,此时找到了和子树根节点相同的结点
flag=HasSubtreetty(pRoot1, pRoot2); if(!flag) flag=HasSubtree(pRoot1->left, pRoot2); if(!flag) flag=HasSubtree(pRoot1->right, pRoot2);
}
return flag;
} bool HasSubtreetty(TreeNode* pRoot1, TreeNode* pRoot2)
{
//该函数需要判断在找到和子树根节点相同的结点之后,判断其余结点是否相同
if(pRoot2==NULL)
return true;
if((pRoot1==NULL)&&(pRoot2!=NULL))
return false;
if(pRoot1->val!=pRoot2->val)
return false;
return HasSubtreetty(pRoot1->left, pRoot2->left)&&HasSubtreetty(pRoot1->right, pRoot2->right);
}
};
3.2 递归实现2
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool IsSubtree(TreeNode* p1, TreeNode* p2)
{
if(p2==NULL)return ;
if(p1==NULL)return ; if(p1->val != p2->val)return ; return IsSubtree(p1->left,p2->left) && IsSubtree(p1->right,p2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL || pRoot2==NULL)return ; return IsSubtree(pRoot1,pRoot2)||
HasSubtree(pRoot1->left,pRoot2) ||
HasSubtree(pRoot1->right,pRoot2);
}
};
4 完整代码
#include <iostream> using namespace std; //struct ListNode {
// int val;
// struct ListNode *next;
// ListNode(int x) : val(x), next(NULL) {}
//}; struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
}; class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
//1.先找到和子树根节点相同的结点
bool flag = false;
if ((pRoot1 != NULL) && (pRoot2 != NULL))
{
if (pRoot1->val == pRoot2->val)
//开始判断,此时找到了和子树根节点相同的结点
flag = HasSubtreetty(pRoot1, pRoot2); if (!flag) flag = HasSubtree(pRoot1->left, pRoot2); if (!flag) flag = HasSubtree(pRoot1->right, pRoot2);
}
return flag;
} bool HasSubtreetty(TreeNode* pRoot1, TreeNode* pRoot2)
{
//该函数需要判断在找到和子树根节点相同的结点之后,判断其余结点是否相同
if (pRoot2 == NULL)
return true;
if ((pRoot1 == NULL) && (pRoot2 != NULL))
return false;
if (pRoot1->val != pRoot2->val)
return false;
return HasSubtreetty(pRoot1->left, pRoot2->left) && HasSubtreetty(pRoot1->right, pRoot2->right);
}
}; int main()
{
Solution *s = new Solution();
TreeNode *t1 = new TreeNode();
TreeNode *t2 = new TreeNode();
TreeNode *t3 = new TreeNode();
TreeNode *t4 = new TreeNode();
TreeNode *t5 = new TreeNode();
TreeNode *t6 = new TreeNode();
TreeNode *t7 = new TreeNode();
TreeNode *t8 = new TreeNode();
TreeNode *t9 = new TreeNode();
t1->left = t2; t1->right = t3;
t2->left = t4; t2->right = t5; t3->left = t6; t3->right = t7;
t4->left = t8; t4->right = t9; TreeNode *tt1 = new TreeNode(); //只有8 6相同时也是子树,返回值为1
//TreeNode *tt2 = new TreeNode(6);
//TreeNode *tt3 = new TreeNode(5);
TreeNode *tt2 = new TreeNode();
TreeNode *tt3 = new TreeNode();
tt1->left = tt2; tt1->right == tt3; bool out_tree = s->HasSubtree(t1, tt1);
cout << out_tree << endl; system("pause");
return ;
}
参考资料
https://blog.csdn.net/weixin_36125166/article/details/75939373
https://blog.csdn.net/danxibaoxxx/article/details/93402407
剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)的更多相关文章
- 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 剑指offer17 合并两个排序的链表
错误代码: 最后两个if语句的目的是,最后一次迭代,两个链表中剩下的直接连接最后一次比较的数值,同时也是迭代停止的标志.虽然大if语句中比较大小得到的Node是正确的值,但每次迭代只要pHead2不为 ...
- 剑指Offer-17.树的子结构(C++/Java)
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构 ...
- 树的子结构(剑指offer-17)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解析 解答 /** public class TreeNode { int val = 0; Tr ...
- 剑指offer38:输入一棵二叉树,求该树的深度
1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...
- 剑指Offer - 九度1521 - 二叉树的镜像
剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...
- 剑指Offer - 九度1350 - 二叉树的深度
剑指Offer - 九度1350 - 二叉树的深度2013-11-23 00:54 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的 ...
- [剑指 Offer 28. 对称的二叉树]
剑指 Offer 28. 对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / ...
随机推荐
- EGL Driver message (Critical) eglInitialize: No available renderers.
使用Python的selenium库进行自动化巡检.并将相对应的数据保存 环境: Windows Embedded Standard Python 2.7.16 selenium 3.141.0 [0 ...
- Atcoder ABC 139B
Atcoder ABC 139B 题意: 一开始有1个插口,你的插排有 $ a $ 个插口,你需要 $ b $ 个插口,问你最少需要多少个插排. 解法: 暴力模拟. CODE: #include< ...
- 5.3.3 自定义writable和RawComparatorWritable
5.3.3 自定义writable (1)构造员工writable Hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很多事情,但是如果你想构造一些更加复杂的结果,你 ...
- ICEM—八分之一球(2D转3D)
原视频下载地址:https://yunpan.cn/cS3UPRtn5rVwY 访问密码 3d8d
- mysql.zip版本的安装教程
MySQL zip版本安装 一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev. ...
- TNetHttpClient的用法
TNetHttpClient的用法 TNetHttpClient是DELPHI XE8新增加的控件. 在之前,我们一般都是使用IDHTTP控件,但在安卓.IOS等非WINDOWS平台,IDHTTP访问 ...
- arcgis python 标注
import arcpy mxd = arcpy.mapping.MapDocument("current") lyr = arcpy.mapping.ListLayers(mxd ...
- javascript-类型、值和变量
基本类型和引用类型 MDN-JavaScript 数据类型和数据结构 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,而引用类型值指那些 ...
- vector swap
#include <iostream>#include <vector>#include <list>#include <deque> using na ...
- Centos7.4.1708安装Jumpserver
Jumpserver 环境要求:硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低)操作系统: Linux 发行版 x86_64Python = 3.6.xMysql Server ≥ 5 ...