剑指offer 树的子结构

题目描述:
输入两棵二叉树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;
           }
    }
}

你可能感兴趣的:(剑指offer)