树的子结构
2015-06-27 10:22
288 查看
来自《剑指offer》的面试题18。
题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:
思路分析:
首先,在Tree1中找到和Tree2的根节点的值一样的结点R;
然后,再判断Tree1中以R为根结点的子树是不是包含和Tree2一样的结构。
分析示例:
解决思路代码:
这里两处判断均使用了递归,详见代码。
测试代码:
测试数据为:
8 8 9 # # 2 4 # # 7 # # 7 # #
8 9 # # 2 # #
运行结果:
牛客网测试地址:http://www.nowcoder.com/books/coding-interviews/6e196c44c7004d15b1610b9afca8bd88?rp=1
题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:
public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }
思路分析:
首先,在Tree1中找到和Tree2的根节点的值一样的结点R;
然后,再判断Tree1中以R为根结点的子树是不是包含和Tree2一样的结构。
分析示例:
解决思路代码:
这里两处判断均使用了递归,详见代码。
public class Solution { public boolean HasSubtree(TreeNode root1, TreeNode root2) { // 在Tree1中查找是否有Tree2的根节点(实际上就是树的遍历) boolean result = false; if (root1 != null && root2 != null) { // 边界条件的检查 if (root1.val == root2.val) { result = DosTree1HasTree2(root1, root2); } if (!result) { result = HasSubtree(root1.left, root2); } if (!result) { result = HasSubtree(root1.right, root2); } } return result; } public boolean DosTree1HasTree2(TreeNode root1, TreeNode root2) { // 判断Tree1中以R为根节点的子树是不是和树B具有相同的结构(即左右子树是否相同) if (root2 == null) { // 递归终止条件到达了Tree1或Tree2的叶节点。 return true; } if (root1 == null) { return false; } if (root1.val != root2.val) { return false; } return DosTree1HasTree2(root1.left, root2.left) && DosTree1HasTree2(root1.right, root2.right); // 递归判断左右子树 } }
测试代码:
// 进行测试 public class Main { Scanner scanner = new Scanner(System.in); public TreeNode createTree(TreeNode root) { String val = scanner.next(); if (val.equals("#")) { return null; } root = new TreeNode(Integer.parseInt(val)); root.left = createTree(root.left); root.right = createTree(root.right); return root; } public static void main(String[] args) { TreeNode root1 = null; TreeNode root2 = null; Main testMain = new Main(); Solution testSolution = new Solution(); boolean result = false; System.out.println("Create Tree 1:"); root1 = testMain.createTree(root1); System.out.println("Create Tree 2:"); root2 = testMain.createTree(root2); result = testSolution.HasSubtree(root1, root2); System.out.println("The result is: " + result); } }
测试数据为:
8 8 9 # # 2 4 # # 7 # # 7 # #
8 9 # # 2 # #
运行结果:
牛客网测试地址:http://www.nowcoder.com/books/coding-interviews/6e196c44c7004d15b1610b9afca8bd88?rp=1
相关文章推荐
- Linux下Qt安装
- UVA 10360 Rat Attack
- HTML学习笔记(四)_HTML5常用元素与属性
- MFC 读取目录中的文件 相对路径
- oracle存储过程及Java调用(转)
- 安全之公开密钥基本知识
- VirtualBox导入XXXX.vdi时报错
- win10手机预览版10149下载点击安装没有反应的解决办法
- 口碑网重生上头条 阿里巴巴和蚂蚁金服注资 60亿
- 网络以及协议基础知识总结
- bundle install
- Ubuntu下和VirtualBox建立ssh无密码访问问题
- 浅析linux内核内存管理之buddy system
- 听说 新东方 的健身房有游泳池,听说 小米 的牛人很多
- Java中对象、对象引用、堆、栈、值传递以及引用传递的详细解释
- LeetCode Combination Sum & Combination Sum II
- MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
- 数据库的隔离级别
- TCP/UDP详解二
- HTML学习笔记(三)_HTML5常用元素与属性