跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
Java版剑指offer编程题第17题–树的子结构: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
我的想法
- 二叉树的题目,一般首先就要想到递归方法啦。
- 递归思想,如果根节点相同则递归调用isSubtree(),当左右节点的递归都返回true时说明树B是树A的子结构。
解题方法1
//递归法
public static boolean HasSubtree(TreeNode1 root1, TreeNode1 root2) {
if(root1 == null || root2 == null) return false;
//从根节点开始,如果根节点不匹配,就向左右子树递归
return isSubtree(root1, root2) ||
HasSubtree(root1.right, root2) ||
HasSubtree(root1.left, root2);
}
public static boolean isSubtree(TreeNode1 root1, TreeNode1 root2){
//第一次进来时root2肯定不为空
//第二次及以后进来时如果roo2为空,就可以直接返回true
if(root2 == null) return true;
//这两行顺序不能调换
if(root1 == null) return false;
if(root1.val == root2.val){
//左子树递归
return isSubtree(root1.left, root2.left) &&
isSubtree(root1.right, root2.right);//右子树递归
}else{
return false;
}
}
代码测试
package com.learnjiawa.jzoffer;
import javax.swing.tree.TreeNode;
/**
* @author learnjiawa
* 2019-12-16-19:01
*/
public class Solution17 {
public static void main(String[] args) {
//创建树A
TreeNode root1= new TreeNode(1);
TreeNode treeNode2 = new TreeNode(2);
TreeNode treeNode3 = new TreeNode(3);
TreeNode treeNode4 = new TreeNode(4);
TreeNode treeNode5 = new TreeNode(5);
TreeNode treeNode6 = new TreeNode(6);
TreeNode treeNode7 = new TreeNode(7);
root1.left = treeNode2;
root1.right = treeNode3;
treeNode2.left = treeNode4;
treeNode2.right = treeNode5;
treeNode3.left = treeNode6;
treeNode3.right = treeNode7;
//创建树B
TreeNode root2 = new TreeNode(2);
TreeNode treeNode8 = new TreeNode(4);
TreeNode treeNode9 = new TreeNode(5);
root2.left = treeNode8;
root2.right = treeNode9;
if(HasSubtree(root1, root2)){
System.out.println("B树是A树的子结构");
}else{
System.out.println("B树不是A树的子结构");
}
}
public static boolean HasSubtree(TreeNode root1, TreeNode root2) {
if(root1 == null || root2 == null) return false;
return isSubtree(root1, root2) || HasSubtree(root1.right, root2) || HasSubtree(root1.left, root2);
}
public static boolean isSubtree(TreeNode root1, TreeNode root2){
if(root2 == null) return true;
if(root1 == null) return false;
if(root1.val == root2.val){
return isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
}else{
return false;
}
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
代码测试控制台输出结果:
总结
拼接链表,第二种解法中要特别注意新建头节点的保存哦,明天见啦!
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava: