题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析
查找A中是否存在树B结构一样的子树,可以分为两步:
第一步,在树A中找到和树B的根节点的值一样的节点R
第二步,判断A中以R为根节点的子树是不是包含和树B一样的结构
以上面为例,先在A中找到值为8的节点,接着判断树A的根节点下面的子树是不是含有和树B一样的结构。在A中根节点的左子节点为8,而树B的根节点的左子节点为9,对应两个节点不同。
接着找8的节点,在A中第二层找到,然后进行第二步的判断(判断这个节点下面的子树是否含有树B一样的结构)
package 剑指offer.树的子结构_26;/*
作者 :XiangLin
创建时间 :19/06/2020 15:24
文件 :HasSubtree.java
IDE :IntelliJ IDEA
*/
public class HasSubtree {
static class TreeNode{
int val;
TreeNode left = null;
TreeNode right = null;
TreeNode next = null; // 指向父结点的指针
public TreeNode(int val){
this.val = val;
}
}
public boolean HasSubtree(TreeNode root1,TreeNode root2){
boolean result = false;
//当root1和root2都不为null的时候,才进行比较。否则直接返回false
if (root1 != null && root2 != null){
//如果找到了对应root2的根节点的点
if (root1.val == root2.val){
//以这个根节点为为起点判断是否包含root2
result = DoesTreeHaveTree2(root1,root2);
}
if (!result){
//如果找不到,那么就再去root1的左儿子当作起点,去判断时候包含root2
result = HasSubtree(root1.left,root2);
}
if (!result){
//如果还找不到,那么就再去root1的右儿子当作起点,去判断时候包含root2
result = HasSubtree(root1.right,root2);
}
}
return true;
}
public boolean DoesTreeHaveTree2(TreeNode node1, TreeNode node2) {
//如果node2已经遍历完了都能对应的上,返回true
if (node2 == null){
return true;
}
//如果node2还没有遍历完,node1却遍历完了。返回false
if (node1 == null){
return false;
}
//如果其中有一个点没有对应上,返回false
if (node1.val != node2.val){
return false;
}
//如果根节点对应的上,那么就分别去子节点里面匹配
return DoesTreeHaveTree2(node1.left,node2.left) && DoesTreeHaveTree2(node1.right,node2.right);
}
}
另外博主收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、机器学习,深度学习等等),大数据系列(Spark,Hadoop,Scala,kafka等),程序员必修系列(C、C++、java、数据结构、linux,设计模式、数据库等等)以下是部分截图
更多文章见本原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】即可领取哦。
给大家推荐一个Github,上面非常非常多的干货:https://github.com/XiangLinPro/IT_book
I don’t want to consider
If I’ll be able to succeed.
Since I’ve decided to go to a distant place,
I’ll try my best to make the trip.
我不去想是否能够成功
既然选择了远方,
便只顾风雨兼程。
2020.6,19 城口