剑指offer:面试题26. 树的子结构
题目:树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制:
0 <= 节点个数 <= 10000
解题:
- 首先要遍历A找出与B根节点一样值的节点R
- 然后判断树A中以R为根节点的子树是否包含和B一样的结构
- 注意:空树不是任意一个树的子结构
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {
public:bool isSubStructure(TreeNode* A, TreeNode* B) {bool res = false;//当TreeA和TreeB都不为零的时候,才进行比较。否则直接返回falseif (A!=NULL && B!=NULL){//如果找到了对应TreeB的根节点的点if (A->val == B->val)//以这个根节点为为起点判断是否包含TreeBres = helper(A, B);//如果找不到,那么就再去TreeA的左子树当作起点,去判断是否包含TreeBif (!res)res = isSubStructure(A->left, B);//如果还找不到,那么就再去TreeA的右子树当作起点,去判断是否包含TreeBif (!res)res = isSubStructure(A->right, B);}// 返回结果return res;}bool helper(TreeNode* A, TreeNode* B){//如果TreeB已经遍历完了都能对应的上,返回trueif (B==NULL)return true;//如果TreeB还没有遍历完,TreeA却遍历完了。返回falseif (A==NULL)return false;//如果其中有一个点没有对应上,返回falseif (A->val != B->val)return false;//如果根节点对应的上,那么就分别去子节点里面匹配return helper(A->left, B->left) && helper(A->right, B->right);}
};
简化代码:
class Solution {
public:bool isSubStructure(TreeNode* A, TreeNode* B) {if (A == NULL || B == NULL) {return false;}return helper(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);}bool helper(TreeNode* A, TreeNode* B) {if (A == NULL || B == NULL) {return B == NULL ? true : false;}if (A->val != B->val) {return false;}return helper(A->left, B->left) && helper(A->right, B->right);}
};
https://www.jianshu.com/p/a04d73417f7c
剑指offer:面试题26. 树的子结构相关推荐
- 剑指Offer - 面试题26. 树的子结构(双重递归)
1. 题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A:3/ \4 5/ \1 2 ...
- 剑指offer面试题26. 树的子结构(链表)
题目描述 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 思路 详见链接 代码 class Solution ...
- 剑指offer——面试题26:复杂链表的复制
剑指offer--面试题26:复杂链表的复制 Solution1: 小套路记住就行!!! 根据书上复杂度为O(n)O(n)O(n)的算法写的,此题加深了对于链表指针的理解与应用! /* struct ...
- [剑指offer]面试题26:复杂链表的复制
面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指 ...
- 《剑指Offer》题目:树的子结构
题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点:2.判断两个二叉树是否 ...
- 剑指offer(C++)-JZ26:树的子结构(数据结构-树)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(我们约定空树不是任意一个树的子结构) ...
- 剑指offer面试题[26]-复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- 剑指offer(17)树的子结构
1. 从根节点开始判断,判断树root2是不是root1的子树. 2. 如果不是,再递归判断root2是不是root1.left的子树. 3. 如果第二步没成立,则再判断root2是不是root1 ...
- 【重点递归】剑指offer——面试题18:树的子结构
剑指offer--面试题18:树的子结构 Solution1: 此题答案是抄的书上的,要记忆并熟练运用关于二叉树的递归思想!!! /* struct TreeNode {int val;struct ...
- 剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...
最新文章
- 如何优雅的设计java异常
- Windows Server 2008安装Memcached笔记
- python四大软件-太牛逼!一款软件几乎可以操作所有的数据库!
- linux日志服务是哪个,『学了就忘』Linux日志管理 — 2.日志服务rsyslogd
- 机器学习之贝叶斯垃圾邮件分类
- 中国网络安全产业白皮书
- button捕捉回车键
- linux服务器内存占用太高-释放内存
- gitlab ssh key
- VM上安装Redhat无法选包
- 软件工程项目迭代周报(一)
- QIIME2进阶四_QIIME2扩增子基因序列系统发育分析
- 谁是最可爱的人,如今又在哪……
- MTK USB OTG功能如何打开及实现
- 什么是信用违约互换(信用违约掉期) - 债券市场中最常见的信用衍生品
- 出海推荐 (出海服务器盘点)
- 两个自变量和一个因变量spss_多个自变量对一个因变量的影响(SPSS:协方差分析)...
- VVC学习之五:帧内预测——67个模式预测信号生成 predIntraAng()
- 三未信安提交招股书注册稿,预计2022年上半年收入同比增两到三成
- 查看论文是否被SCI检索