xiaomi

个人博客

小米的个人博客,欢迎交流


每天一道剑指offer:树的子结构


题目描述:题目传送门

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)


解题思路

判断B是不是A的子树 —-> A中包含B的结构

  1. 我们遍历二叉树A的节点,直到找到与二叉树根节点的值相同为止
  2. 然后再比较该节点下的子节点是不是和二叉树B的子节点的值相同
  3. 如果不是,那我们接着遍历A树,找出下一个与B树根节点值相同的节点
  4. 重复2、3步骤直到遍历完A树或B树


代码

public class Solution { 
//    查询A树中是否包含B树的根节点
     public boolean HasSubtree(TreeNode root1, TreeNode root2) {

        if (root1 == null) return false;
        if (root2 == null) return false;
//        最后的结果
        boolean res = false;
         
//        找到值相同的节点
        if (root1.val == root2.val) {
//            继续判断B树的子节点与A树子节点是否值相等
            res = JudgeTree(root1, root2);
        }
//        向左搜索
        if (!res) {
            res = HasSubtree(root1.left, root2);
        }
//        向右搜索
        if (!res) {
            res = HasSubtree(root1.right, root2);
        }

        return res;
    }
    
//    判断B树中根节点外的子节点是否也在A树中
    public boolean JudgeTree(TreeNode root1, TreeNode root2) {
//        B树遍历结束,说明A树包含B树
        if (root2 == null) return true;
//        A树遍历结束,没有发现B树的结构
        if (root1 == null) return false;
//        该节点的值不相等,继续寻找
        if (root1.val != root2.val) return false;
        
//        比较A/B两树左右节点的值
        return JudgeTree(root1.right, root2.right) && JudgeTree(root1.left, root2.left);
    }
}

样例:

 TreeNode root1 = new TreeNode(1);
        TreeNode r11 = new TreeNode(5);
        TreeNode r12 = new TreeNode(3);
        TreeNode r13 = new TreeNode(7);
        TreeNode r14 = new TreeNode(5);
        TreeNode r15 = new TreeNode(7);
        TreeNode r16 = new TreeNode(6);
        root1.left = r11;
        root1.right = r12;
        r11.left = r13;
        r12.left = r14;
        r14.right = r16;
        r14.left = r15;

        TreeNode root2 = new TreeNode(5);
        TreeNode r21 = new TreeNode(7);
        TreeNode r22 = new TreeNode(6);
        root2.left = r21;
        root2.right = r22;

        System.out.println(HasSubtree(root1, root2));

//A树                     
    1
  5   3
7       5
     7    6
        
//B树
    5    
  7   6