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. tarjan求强连通分量(模板)

    https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...

  2. phpstorm+xdebug安装配置

    这个问题也困惑了我好久 烦死了 今天看了qing师傅的博客 跟着安装 运行环境: phpStorm 2018 PHP 5.45 nts VC9 Xdebug 2.4.1 0x01 PHP安装xdebu ...

  3. easyui-combobox和C标签判断回显

    <td width="40%"> <select class="easyui-combobox" id="work_property ...

  4. ICEM-五通孔管

    原视频下载地址:https://yunpan.cn/cqaQ2t5DrRcKa  访问密码 d111

  5. Embedded based learning

    简单整理了一些嵌入式底层需要接触的相关概念.   # CPU  CU. Control Unit. send need-clac-data -> ALU clac -> get resul ...

  6. chrome console控制台引入jquery库

    var jqueryJs=document.createElement('script');jqueryJs.setAttribute("type","text/Java ...

  7. HearthBuddy 召唤随从的问题

    代码如下,在SilverFish\SilverFish\ai\Playfield.cs文件中 public void callKid(CardDB.Card c, int zonepos, bool ...

  8. [.NET] ConfuserEx脱壳工具打包

    [.NET] ConfuserEx脱壳工具打包 ConfuserEx 1.0.0脱壳步骤        Written by 今夕何夕[W.B.L.E. TeAm] 1.先用UnconfuserEx把 ...

  9. c++拷贝文件-传统处理异常(学习)

    #include <iostream>#include <stdio.h> using namespace std; int my_copy(const char* src_f ...

  10. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...