本人新手为了面试互联网公司,将刷题做一个记录以及总结,方便之后学习!!
第22道问题 剑指offer 26为一道中等题
题目:
力扣https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/
1.自己思路,要找b是否为a的子树,需要比较当b的根节点与a的根节点相同时,还需要比较左右节点。此题也是参考了题解。之前一直没做对,看了题解之后打开了思路。
使用两次递归。
1.递归b是a的子树,b是a的左子树的子树,或者b是a的右子树的子树。目标就是找到相同的根节点。
2.二次递归就是子树的所有节点与a进行对照,看是否完全一样,否则为false。
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B == null || A == null){
return false;
}
//第一次递归
return dfs(A,B)||isSubStructure(A.left,B) ||isSubStructure(A.right,B);
}
public boolean dfs(TreeNode a,TreeNode b){
if(b == null){//说明没有b了
return true;
}
if(a == null){//a不能与b相对应。
return false;
}
//a,b分别为根节点,其他的也都相等,二次递归
return a.val ==b.val && dfs(a.left,b.left) && dfs(a.right,b.right);
}
}
结果:
总结:
1.对二叉树的变量以及相应的算法了解比较少。
2.递归使用的不熟练。