本题来自左神《程序员代码面试指南》“判断 t1 树是否包含t2 树全部的拓扑结构”题目。

题目

剑指 Offer 26. 树的子结构

给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 树是否包含 t2 树全部的拓扑结构。
例如,如图 3-34 所示的 t1 树和如图 3-35 所示的 t2 树。


题解

思路如下。

如果 t1 中某棵子树头节点的值与 t2 头节点的值一样,则从这两个头节点开始匹配。匹配的每一步,都让 t1 上的节点跟着 t2 上的节点的先序遍历移动,每移动一步,都检查 t1 的当前节点是否与 t2 当前节点的值一样。

因此,如果 t1 的节点数为 N,t2 的节点数为 M,则该方法的时间复杂度为 O(N×M)


代码

1、leetcode AC代码

public static boolean isSubStructure(TreeNode A, TreeNode B) {if (B == null) return false; // 不直接在此函数中递归前序遍历,是因为题目约定空树不是任意一个树的子结构return preOrder(A, B);
}// 前序遍历,找到每一个相同的A、B作为头结点,然后调用isSub
public static boolean preOrder(TreeNode A, TreeNode B) {if (A == null) return false;if (A.val == B.val) {if (isSub(A.left, B.left) && isSub(A.right, B.right))return true;}return preOrder(A.left, B) || preOrder(A.right, B);
}// 判断是否"严格"子树,即A、B都是头结点的情况
public static boolean isSub(TreeNode A, TreeNode B) {if (B == null) return true;// B!=nullif (A == null) return false;// B!=null && A!=nullif (A.val == B.val) return isSub(A.left, B.left) && isSub(A.right, B.right);// B!=null && A!=null && A.val != B.valreturn false;
}

2、左神代码

含测试用例

public class Problem_11_T1ContainsT2Topology {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}// 前序遍历,判断是否"严格"子树或"包含"子树public static boolean contains(Node t1, Node t2) {if (t2 == null) {return true;}if (t1 == null) {return false;}return check(t1, t2) || contains(t1.left, t2) || contains(t1.right, t2);}// 判断是否"严格"子树,即h、t2都是头结点的情况public static boolean check(Node h, Node t2) {if (t2 == null) {return true;}if (h == null || h.value != t2.value) {return false;}return check(h.left, t2.left) && check(h.right, t2.right);}public static void main(String[] args) {Node t1 = new Node(1);t1.left = new Node(2);t1.right = new Node(3);t1.left.left = new Node(4);t1.left.right = new Node(5);t1.right.left = new Node(6);t1.right.right = new Node(7);t1.left.left.left = new Node(8);t1.left.left.right = new Node(9);t1.left.right.left = new Node(10);Node t2 = new Node(2);t2.left = new Node(4);t2.left.left = new Node(8);t2.right = new Node(5);System.out.println(contains(t1, t2));}
}

左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)相关推荐

  1. 【LeetCode】剑指 Offer 26. 树的子结构

    [LeetCode]剑指 Offer 26. 树的子结构 文章目录 [LeetCode]剑指 Offer 26. 树的子结构 package offer;//定义树节点 class TreeNode{ ...

  2. 左神算法:未排序正数数组中累加和为给定值的最长子数组长度(Java版)

    本题来自左神<程序员代码面试指南>"未排序正数数组中累加和为给定值的最长子数组长度"题目. 题目 牛客OJ:未排序数组中累加和为给定值的最长子数组长度 题解 本文提供的 ...

  3. 剑指offer——26.树的子结构(不太熟)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 知识点: 无 注意: 注意想法的递归实现(好好琢磨一下,不然可能会忘!) 代码实现: 具体实现分两步 ...

  4. 剑指 Offer 26树的子结构(相关话题:对称性递归,在线算法)

    目录 开篇引言 题目描述 代码实现 题目拓展 拓展解读 一类 100. 相同的树

  5. 【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构

    看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最"笨"最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法. 输 ...

  6. LeetCode——剑指 Offer 26. 树的子结构

    一.题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3/ \4 5/ \1 2 ...

  7. 剑指offer 26 树的子结构

    输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / \ 4 5 / 1 2 给定 ...

  8. 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符

    一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...

  9. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

最新文章

  1. 大厂围城:千辛万苦杀进来,为何他们选择出逃?
  2. (Mirage系列之五)Mirage经典案例之桌面驱动和基础层管理
  3. torch.roll() 详解
  4. python dataframe取列名_python – 获取列名在DataFrame中按其值排序
  5. html 载入中,用纯CSS实现加载中动画效果
  6. x264中I,P,B帧和PTS,DTS的关系
  7. 使用ob_gzhandler函数有3种方法让它对php进行压缩
  8. linux c99 可变长数组,C中不支持可变长度数组C99(Variable length arrays C99 not supported in C)...
  9. 爬了知乎 200 万数据,图说程序员都喜欢去哪儿工作
  10. [排错] Status error 2850
  11. delphi 子接口是否实现父接口_您可以从子类接口的接口调用父接口的默认方法吗?...
  12. Silverlight 解谜游戏 之七 放大镜(3)
  13. 调用Powergui FFT Analysis Tool进行FFT分析
  14. Django新增数据
  15. 微信会员卡 java请求_会员系统对接微信会员卡的好处
  16. string类函数和牛客网剑指offer刷题记录
  17. 微积分review 极限,迫敛性,极限四则运算,自然常数来历
  18. 李宏毅机器学习 Regression
  19. 爬取《悲伤逆流成河》猫眼信息 | 郭敬明五年电影最动人之作
  20. 软件项目管理【期末模拟卷】

热门文章

  1. (转)离散化:两种离散化方式详解
  2. java中所有的类都继承于_Java中所有的类都是通过直接或间接地继承()类得到的...
  3. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----UDP篇
  4. 网狐棋牌(二) CQueueServiceEvent初步分析
  5. STL 之fill和fill_n
  6. 某次元app之data参数分析
  7. 第46讲:遇到动态页面怎么办?详解渲染页面爬取
  8. Amazon上最畅销的「操作系统书」有哪些?
  9. 曹大:我的快速阅读法
  10. 计算机基础- -认识汇编