1 题目描述

  输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

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:我们约定空树不是任意一个树的子结构)的更多相关文章

  1. 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  2. 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  3. 剑指offer17 合并两个排序的链表

    错误代码: 最后两个if语句的目的是,最后一次迭代,两个链表中剩下的直接连接最后一次比较的数值,同时也是迭代停止的标志.虽然大if语句中比较大小得到的Node是正确的值,但每次迭代只要pHead2不为 ...

  4. 剑指Offer-17.树的子结构(C++/Java)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构 ...

  5. 树的子结构(剑指offer-17)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解析 解答 /** public class TreeNode { int val = 0; Tr ...

  6. 剑指offer38:输入一棵二叉树,求该树的深度

    1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...

  7. 剑指Offer - 九度1521 - 二叉树的镜像

    剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...

  8. 剑指Offer - 九度1350 - 二叉树的深度

    剑指Offer - 九度1350 - 二叉树的深度2013-11-23 00:54 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的 ...

  9. [剑指 Offer 28. 对称的二叉树]

    剑指 Offer 28. 对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / ...

随机推荐

  1. 在Android中使用OpenGL ES进行开发第(一)节:概念先行

    一.前期基础是知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGL ES绘制 ...

  2. macOS Mojave 10.14 无法安装brew缺少Command Line Tools for Xcode的解决办法

    问题描述: 首先我的版本是 Xcode 10.1 如果按照以前的方法安装brew 复制 1 /usr/bin/ruby -e "$(curl -fsSL https://raw.github ...

  3. golang sqlx查询时, struct字段冲突

    type TA struct { Id int64 `db:"id"` } type TB struct { Id int64 `db:"id"` } type ...

  4. git仓库与项目源码分离

    在服务器上初始化git仓库 cd mkdir gitrepo cd gitrepo git init --bare runoob.git 本地 若是已经有git项目了,直接添加一个仓库地址就行了 gi ...

  5. ThinkPHP6.0学习之项目安装页面的开发

    在我们做一个项目的时候,如果是自己用或者是给同行用的话往往不需要做一个安装页面的,但是如果是将项目给一些不怎么会操作服务器,不怎么会程序的人用的时候,我们就需要一个安装页面来帮助他们更好的将项目安装好 ...

  6. SQL-W3School-高级:SQL UNIQUE 约束

    ylbtech-SQL-W3School-高级:SQL UNIQUE 约束 1.返回顶部 1. SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIM ...

  7. Android 显示系统:OpenGL简介和Gralloc代码分析

    一.OpenGL ES与EGL Android的GUI系统是基于OpenGL/EGL来实现的. 由于OpenGL是通用函数库,在不同平台系统上需要被“本土化”——把它与具体平台的窗口系统建立起关联,F ...

  8. yum -y与 yum有什么区别

    在linux中,经常使用yum来进行软件的安装,更新与卸载,那我们会发现,在使用yum的时候,通常有下面两种指令模式: ①yum install  xxx ②yum -y install  xx 那这 ...

  9. 【工具】sqlmap 中文手册 使用教程

    日期:2019-07-28 09:27:27 更新: 作者:Bay0net 介绍:自己翻译了一下,做个备忘. 0x01. 基本信息 官网 sqlmap: automatic SQL injection ...

  10. mongodb and 和 or 查询

    db.getCollection('gxyWarnEntity').find({ "schoolId" : "f11c8ea12f457dbc19c768a8bb6357 ...