• 转载:https://blog.csdn.net/qinian_ztc/article/details/104731375

  • 看到某博主写的博客,逻辑很清晰,记录学习一下

  • 参考网上的博客得出的子树和子结构的区别:子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。

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

  • 思路:

    • 1.在大树中找到与小树根节点相同的节点;

    • 2.大树以此为根节点,向下搜索并对比是否与小树节点相同,相同返回true,否则为false;

    • 3.如果第二步返回false回到第一步,从大树的左子树查找与小树根节点相同的节点;

    • 4.如果第三步最终返回false回到第一步,从大树的右子树查找与小树根节点相同的节点。

      public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        // 第一步
        if(root2 == null || root1 == null) return false;
        boolean result = false;
        if(root1.val == root2.val){
            // 第二步
            result = hasSubtreeHelper(root1, root2);
        }
        //第三步
        if(!result) result = HasSubtree(root1.left, root2);
        //第四步
        if(!result) result = HasSubtree(root1.right, root2);
        return result;
      }
      
      private boolean hasSubtreeHelper(TreeNode root1,TreeNode root2){
      
        if(root2 == null) return true;
        if(root1 == null) return false;
        if(root1.val != root2.val) return false;
        return hasSubtreeHelper(root1.left, root2.left)&& hasSubtreeHelper(root1.right, root2.right);
      }