输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
今天是1024但是还是无奈加班,于是就决定写一篇博客(当然不是为了徽章,手动狗头)
题解
首先的看到这个题目,先想到一个基本思路,就是循环遍历,递归,肯定是向方法里面输入两棵树的节点,然后他只是说判断后者是不是前者的子结构,所以我们认为A的高度>=B,
所以我们需要遍历A这一棵树即可,从结构上来说就是遍历A节点,A节点不等于B节点,就开始遍历A节点的左子树,右子树,然后如果还是没有则需要再次遍历A的左子树的左子树和右子树,以此类推遍历到出现B相同的节点或者是到达所有的叶子节点。
其实我感觉问题的难点就是在如何变回来,其实理解是理解了但是具体使用肯定还是有距离的,上代码
代码详解
/**
* 方法解读
* 最开始县判空,判断是否为空
* 然后判断值是否相等如果相等则进入另外的方法中
* 如果不相等的话就进入本方法进行遍历
* 如果相等的话
* @param root1
* @param root2
* @return
*/
public static boolean HasSubtree(TreeNode root1, TreeNode root2) {
boolean result = false;
//当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false
if (root2 != null && root1 != null) {
//如果找到了对应Tree2的根节点的点
if(root1.val == root2.val){
//以这个根节点为为起点判断是否包含Tree2
result = doesTree1HaveTree2(root1,root2);
}
//如果找不到,那么就再去root的左儿子当作起点,去判断时候包含Tree2
if (!result) {
result = HasSubtree(root1.left,root2);
}
//如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含Tree2
if (!result) {
result = HasSubtree(root1.right,root2);
}
}
//返回结果
return result;
}
public static boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2) {
//当第一和第二个都遍历完,返回true
if (node2 == null && node1 == null ) {
return true;
}
//如果其中有一个点没有对应上,返回false
if (node1.val != node2.val) {
return false;
}
//如果根节点对应的上,那么就分别去子节点里面匹配
return doesTree1HaveTree2(node1.left,node2.left) && doesTree1HaveTree2(node1.right,node2.right);
}
HasSubtree
这个方法就是提交的方法,两个参数就是两个树结构,前边的那个就是需要遍历的结构,后面的那个结构就是需要查询是否有的,然后我再开始定义一个boolean的变量用于判断是够出现后面的那个树形节点,我们将前边的树节点定义为A,后面的元素树节点定义为B,如果第一次就是A或者B有一个为空那就是将boolean的初始值返回- 如果A节点和B节点不为空的情况下,我们开始遍历首先我们通过节点的值来进行判断如果两个节点的值相同的话我们进入到判断子节点的方法里面,如果还没有发现B是A的子节点的情况下开始将A的节点的左子树和B节点进行遍历,然后是在没有返现B是A的子树的情况下开始遍历。
- 其实在代码中使用的递归,就是虽然你是将左子树和右子树放在一起的时候但是其实他是先遍历左子树,一个不行,就遍历他的左子树的左子树是否符合。
比如说在如图的树,给出A节点和G节点,首先开始遍历A,看A的左子树B的值是否和G的值相同,如果不相等的话就看B的左子树D,看B的左子树D是否和G树相同,如果还是不相等,那就开始寻找D的左子树,发现D没有左子树,然后就返回false,然后后退一步,然后看D的右子树是否和G相等,如果不相等则再退一步,看B的右子树是否是G,然后是E的左子树,E的右子树,以此类推现寻找一个值相等的节点,然后是判断相等的方法。
- 如果是相等情况下,我们进行判断是否是同一个节点,判断的依据是什么呢?
- 就是首先值相等,其次是所有的子结构都相等,如果两个子结构都为null则证明两个到了叶子节点(但是我认为这个还是有些许的问题),只要他们两个的子节点有一个不一样则直接返回false再次进行遍历
这就是这一道题的分析和代码情况,在最后说一些今天的感受,我在去年的今天还在辅导班中的自己学习,记得那时自己看数据结构的时候,早上写博客背东西中午看数据结构视频,晚上做一些算法题充实且辛苦,现在自己因为疫情进了一家国企,昨天同事结婚回请听着83年的副部长跟我说外面的世界很残酷,在济南我们公司也还算不错了,后面会越来越难进,不明白自己的选择,从长远来看有国企背景的公司会更加的稳定,是我30以后的首选,但是对于我现在,有一点不甘心真的不甘心,想要更高的工资,虽然i自己在一个二线城市但是买房子的压力也是很大,不明白自己的选择,只能选择提升自己一点一点的,加油吧打工人