LintCode 子树
来源:互联网 发布:js遍历数组foreach 编辑:程序博客网 时间:2024/06/07 03:36
题目
有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。 注意事项若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。样例:下面的例子中 T2 是 T1 的子树: 1 3 / \ / T1 = 2 3 T2 = 4 / 4下面的例子中 T2 不是 T1 的子树: 1 3 / \ \T1 = 2 3 T2 = 4 / 4
//Definition of TreeNodepublic class TreeNode { public int val; public TreeNode left, right; public TreeNode(int val) { this.val = val; this.left = this.right = null; }}
思路
- 采用递归思想,递归数每个节点,及其左右子树是否与子树相等。
- 先判断节点是否相等,找到相等的节点再判断左右子树。
- 判断相等的过程中,如果发现不等,直接结束,相等则继续。
- 判断是否是子树的过程中,先判断节点是否相等;节点不等,递归节点左子树;如果不是左子树的子树,再递归右子树,判断是不是右子树的子树。
代码
public boolean isSubtree(TreeNode T1, TreeNode T2) { // write your code here boolean flag = false; if (T2 == null) return true; if (T1 != null) { //判断节点是否相等 flag = isSame(T1, T2); if (!flag) { //节点不等,递归节点左子树 flag = isSubtree(T1.left, T2); if (!flag) { //左子树不等,递归右子树 flag = isSubtree(T1.right, T2); } } } return flag; } //判断两个树是否相同 public boolean isSame(TreeNode a, TreeNode b) { if (a == null && b == null) { //都为空,必定相同 return true; } else if (a == null || b == null) { //其中一个为空,必定不同 return false; } else { //节点值不等 if (a.val != b.val) { return false; } else { //递归左子树 boolean result = isSame(a.left, b.left); if (!result) { //发现不等,直接跳过 return result; } else { //递归右子树 result = isSame(a.right, b.right); return result; } } } }
参考
http://www.cnblogs.com/dongling/p/5795933.html
阅读全文
0 0
- LintCode 子树
- lintcode-子树
- lintcode ----子树
- lintcode,子树
- LintCode 子树
- 子树-LintCode
- LintCode-子树
- Lintcode 子树
- lintcode子树
- LintCode 子树
- LintCode 子树
- 子树-LintCode
- 子树(LintCode)
- lintcode subtree 子树
- lintcode——子树
- [LintCode]245.子树
- LintCode-剑指Offer-(245)子树
- lintcode-递归-简单-245子树
- 高效读写消息队列SafeQueue
- Go 关键字 defer 的一些坑你需要踩踩
- jsonp实现原理及核心代码例子
- 字典序排列之后, 求其中的第m个数
- python 基础编程之求两个数组的交集
- LintCode 子树
- matlab读写文件
- miniui datagrid 多表头
- PHP Socket详解
- 前端实用工具分享——字符串拼接(一)
- 开始使用STM32CubeMX
- 【Python】Python3 List clear()方法
- 关于AXI总线乱序传输的问题
- Ubuntu 查看硬件信息方法