题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
递归root1节点:
如果当前的root1对应的树和root2对应的树相等,那么就直接可以返回true,如果不相等,再分别拿root1的左子树和root1的右子树去和root2进行比对,递归判断。
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null||root2==null){
return false;
}else{
return isSubtree(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
}
判断两个节点引出的二叉树相等的方法:
这个也需要用到递归,如果当前两个节点是相等的,那么对root1和root2分别递归左子树和右子树继续比较,当最后root2为null了就返回true。
public 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;
}
}
思考和回顾:
记得之前在LeetCode中,有这样一道题,找出路径和等于给定数值的路径数。这题也用到了两个递归,一个是递归出发点,一个是获取出发点对应的可能的路径数。这两题思路很类似,都是递归整棵树+递归当前节点。
特殊情况处理:
如果root1和root2在刚开始就为null,那么肯定返回false。
如果在isSubtree()方法中root1先结束,那么也返回false,因为root2还存在root1对应的树不存在的部分。
如果root2先结束,那么可以说明它是原树的一部分。
如果发现两个节点的值不同了,则返回false。
完整代码:
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null||root2==null){
return false;
}else{
return isSubtree(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
}
public 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;
}
}
}
本文介绍了一种算法,用于判断一棵二叉树是否是另一棵二叉树的子结构。通过递归方法,首先检查根节点是否相等,然后分别检查左子树和右子树。文章详细解释了代码实现,并讨论了特殊情况处理。
178

被折叠的 条评论
为什么被折叠?



