剑指Offer--面试题18:数的子结构--Java实现
2015-06-16 20:26
741 查看
题目描述:
输入两颗二叉树A和B,判断B是不是A的子结构。
解题思路:
要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。
通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。
代码如下:
代码中的测试案列:
A:
B:
输入两颗二叉树A和B,判断B是不是A的子结构。
解题思路:
要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。
通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。
代码如下:
public class HasSubTreeTest { static class Node{ int key; Node left; Node right; Node(int key){ this.key = key; } } public static boolean hasSubTree(Node root1, Node root2){ boolean result = false; if(root1 != null && root2 != null){ result = doesTreeHaveTree2(root1, root2); if(!result){ result = hasSubTree(root1.left, root2); } if(!result){ result = hasSubTree(root1.right, root2); } } return result; } private static boolean doesTreeHaveTree2(Node root1, Node root2) { if(root2 == null){ return true; } if(root1 == null){ return false; } if(root1.key != root2.key){ return false; } return doesTreeHaveTree2(root1.left, root2.left) && doesTreeHaveTree2(root1.right, root2.right); } public static void main(String[] args) { Node root1 = new Node(8); Node node8 = new Node(8); Node node7 = new Node(7); root1.left = node8; root1.right = node7; Node node9 = new Node(9); node8.left = node9; Node node2 = new Node(2); node8.right = node2; Node node4 = new Node(4); Node node72 = new Node(7); node2.left = node4; node2.right = node72; Node root2 = new Node(8); Node node92 = new Node(9); Node node22 = new Node(2); root2.left = node92; root2.right = node22; System.out.println(hasSubTree(root1, root2)); } }
代码中的测试案列:
A:
B:
相关文章推荐
- 黑马程序员--文件操作知识总结
- 笔试面试-2015华为软件开发实习生
- EMC测试开发实习生面试记录
- 面试题:最大的子数组之和,和最大子数组的始末位置
- 关于职业规划
- 黑马程序员----Java基础之面向对象(封装 继承 多态)(二)
- 第一部分、十道海量数据处理面试题
- Java面试题目整理
- 让程序员跳槽的非钱原因
- 一个程序员工作一年来收藏的网站 .
- 面试3道测试题
- 黑马程序员——Java基础——泛型类、包装类
- 黑马程序员——Java基本语法(二):程序流程控制、函数、数组
- 【程序员宝典】递归
- 黑马程序员——JAVA-IO
- 黑马程序员——异常总结
- 黑马程序员——面向对象总结
- Android面试题收集
- 黑马程序员----Java基础之面向对象(封装 继承 多态)
- “好程序员笔记”——IO操作