描述

输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

思路:递归

递归遍历大树的每个节点,和小树进行比较。时间复杂度O(MN)。M为A的节点数,N为B的节点数

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null) {
            return false;
        }
        boolean r1 = isEqual(root1, root2);
        boolean r2 = HasSubtree(root1.left, root2);
        boolean r3 = HasSubtree(root1.right, root2);
        return r1 || r2 || r3;
    }
    
    boolean isEqual(TreeNode root1, TreeNode root2) {
        // 小树遍历完成,说明全部节点匹配
        if(root2 == null) {
            return true;
        }
        if(root1 == null || root1.val != root2.val) {
            return false;
        }
        // 递归比较左右节点
        return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
    }
}

思路2:借助队列

使用队列对大树进行层序遍历

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null) {
            return false;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root1);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(isEqual(node, root2)) {
                return true;
            }
            if(node.left != null) {
                queue.offer(node.left);
            }
            if(node.right != null) {
                queue.offer(node.right);
            }
        }
        return false;
    }
    
    boolean isEqual(TreeNode root1, TreeNode root2) {
        if(root2 == null) {
            return true;
        }
        if(root1 == null || root1.val != root2.val) {
            return false;
        }
        return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
    }
}