左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)
本题来自左神《程序员代码面试指南》“判断 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版)相关推荐
- 【LeetCode】剑指 Offer 26. 树的子结构
[LeetCode]剑指 Offer 26. 树的子结构 文章目录 [LeetCode]剑指 Offer 26. 树的子结构 package offer;//定义树节点 class TreeNode{ ...
- 左神算法:未排序正数数组中累加和为给定值的最长子数组长度(Java版)
本题来自左神<程序员代码面试指南>"未排序正数数组中累加和为给定值的最长子数组长度"题目. 题目 牛客OJ:未排序数组中累加和为给定值的最长子数组长度 题解 本文提供的 ...
- 剑指offer——26.树的子结构(不太熟)
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 知识点: 无 注意: 注意想法的递归实现(好好琢磨一下,不然可能会忘!) 代码实现: 具体实现分两步 ...
- 剑指 Offer 26树的子结构(相关话题:对称性递归,在线算法)
目录 开篇引言 题目描述 代码实现 题目拓展 拓展解读 一类 100. 相同的树
- 【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构
看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最"笨"最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法. 输 ...
- LeetCode——剑指 Offer 26. 树的子结构
一.题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3/ \4 5/ \1 2 ...
- 剑指offer 26 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / \ 4 5 / 1 2 给定 ...
- 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符
一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...
- 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...
最新文章
- 大厂围城:千辛万苦杀进来,为何他们选择出逃?
- (Mirage系列之五)Mirage经典案例之桌面驱动和基础层管理
- torch.roll() 详解
- python dataframe取列名_python – 获取列名在DataFrame中按其值排序
- html 载入中,用纯CSS实现加载中动画效果
- x264中I,P,B帧和PTS,DTS的关系
- 使用ob_gzhandler函数有3种方法让它对php进行压缩
- linux c99 可变长数组,C中不支持可变长度数组C99(Variable length arrays C99 not supported in C)...
- 爬了知乎 200 万数据,图说程序员都喜欢去哪儿工作
- [排错] Status error 2850
- delphi 子接口是否实现父接口_您可以从子类接口的接口调用父接口的默认方法吗?...
- Silverlight 解谜游戏 之七 放大镜(3)
- 调用Powergui FFT Analysis Tool进行FFT分析
- Django新增数据
- 微信会员卡 java请求_会员系统对接微信会员卡的好处
- string类函数和牛客网剑指offer刷题记录
- 微积分review 极限,迫敛性,极限四则运算,自然常数来历
- 李宏毅机器学习 Regression
- 爬取《悲伤逆流成河》猫眼信息 | 郭敬明五年电影最动人之作
- 软件项目管理【期末模拟卷】