剑指offer:树的子结构(java)
2016-10-02 20:13
393 查看
题目:输入两棵二叉树A和B,判断B是不是A的子结构。
例如图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。
要查找树A中是否存在和树B结构一样的子树,思路是第一步:先在树A中查找与根结点的值一样的结点,这实际就是树的先序遍历,当树A和树B为空时,定义相应的输出。如果树A某一结点的值和树B头结点的值相同,则调用doesTree1HaveTree2,做第二步判断。第二步是判断树A中以R为根结点的子树是不是和树B具有相同的结构,使用递归的方法考虑:如果结点R和树B的根结点不相同则返回false,如果相同,则递归判断它们的左右结点的值是不是相同。递归终止条件是我们到达树A或者树B的叶结点。
功能测试(树A和树B都是普通的二叉树,树B是或不是树A的子结构)
特殊输入测试(两课二叉树的一个或者两个根结点为NULL指针、二叉树的所有结点都没有左子树或者右子树)
例如图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。
要查找树A中是否存在和树B结构一样的子树,思路是第一步:先在树A中查找与根结点的值一样的结点,这实际就是树的先序遍历,当树A和树B为空时,定义相应的输出。如果树A某一结点的值和树B头结点的值相同,则调用doesTree1HaveTree2,做第二步判断。第二步是判断树A中以R为根结点的子树是不是和树B具有相同的结构,使用递归的方法考虑:如果结点R和树B的根结点不相同则返回false,如果相同,则递归判断它们的左右结点的值是不是相同。递归终止条件是我们到达树A或者树B的叶结点。
public boolean hasSubTree(BinaryTreeNode root1,BinaryTreeNode root2){ if(root2 == null) return true; if(root1 == null) return false; boolean result = false; if(root1 != null && root2 != null){ if(root1.value == root2.value) result = doesTree1HaveTree2(root1,root2); if(!result) result = hasSubTree(root1.leftNode,root2); if(!result) result = hasSubTree(root1.rightNode ,root2); } return result; } public boolean doesTree1HaveTree2(BinaryTreeNode root1,BinaryTreeNode root2){ if(root2 == null) return true; if(root1 == null) return false; if(root1.value != root2.value) return false; return doesTree1HaveTree2(root1.leftNode,root2.leftNode) && doesTree1HaveTree2(root1.rightNode,root2.rightNode); }测试用例:
功能测试(树A和树B都是普通的二叉树,树B是或不是树A的子结构)
特殊输入测试(两课二叉树的一个或者两个根结点为NULL指针、二叉树的所有结点都没有左子树或者右子树)
相关文章推荐
- 剑指Offer:树的子结构(JAVA)
- 【剑指offer——JAVA实现】树的子结构
- 【剑指offer-Java版】18树的子结构
- 剑指offer——树的子结构 (JAVA代码)
- 剑指Offer--面试题18:数的子结构--Java实现
- 剑指Offer面试题18(Java版):树的子结构
- 剑指offer----树的子结构----java实现
- 剑指offer解题报告(Java版)——树的子结构 18
- 剑指Offer面试题18(Java版):树的子结构
- 【剑指offer】面试题18:树的子结构
- 剑指offer实践(Java)
- 【剑指Offer面试编程题】题目1520:树的子结构--九度OJ
- 剑指offer-面试题7:俩个栈实现队列(java)
- 剑指offer-面试题7:俩个栈实现队列(java)
- 【剑指offer】面试题5:从尾到头打印链表 java
- 剑指offer面试题4 替换空格(java)
- 【剑指offer】Q18:树的子结构
- 剑指Offer18树的子结构
- 剑指Offer-题16 反转链表(Java)
- 剑指offer第19题java版