剑指offer-面试题26:树的子结构

题目描述

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

思路分析

剑指offer-面试题26:树的子结构_第1张图片

树的子结构和树的子树需要区别开,树的子树指的是树的某一部分,例如图B就是图A的一部分为子树。子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树;

剑指offer-面试题26:树的子结构_第2张图片
子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取;判断树B是否是树A的子结构可以分成两步来实现:

  • 第一步:在树A中找到和树B的根结点的值一样的节点;
  • 第二步:判断树A中以R为根结点的子树是不是包含和树B一树的结构;
    例如上面的树,我们首先在树A中找到和树B的根结点一样的结点8,就是根结点,接着判断树A的子树是不是含有和树B一样的结构,树B的左孩子是9,右孩子是2,在树A的左子树中找到结点9,在右子树中找到结点2,所以树B是树A的子结构;

可以参考:面试题26. 树的子结构(先序遍历 + 包含判断,清晰图解)

代码实现

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
   public boolean HasSubtree(TreeNode root1, TreeNode root2) {
        if (root2 == null || root1 == null) {
            return false;
        }
        return judgeSubstructure(root1, root2) || judgeSubstructure(root1.left, root2) || judgeSubstructure(root1.right, root2);
    }

    private boolean judgeSubstructure(TreeNode root1, TreeNode root2) {
        ///root2为null表示子结构前面全部匹配,所以为true
        if (root2 == null) {
            return true;
        }
        ///root1为null表示树的所有结点都被访问完了,仍然不能匹配所以为false
        if (root1 == null) {
            return false;
        }
        ///如果树当前结点不匹配子结构,判断树的子树(树当前结点的左边或者右边)是否有匹配的结点
        if (root1.val != root2.val) {
            return judgeSubstructure(root1.left, root2) || judgeSubstructure(root1.right, root2);
        }
        return judgeSubstructure(root1.left, root2.left) && judgeSubstructure(root1.right, root2.right);
    }
}

欢迎关注南阁公众号

南阁子也

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