二叉树检查子树

题目描述

检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。
如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。
题目来源力扣

示例1

输入:t1 = [1, 2, 3], t2 = [2]
输出:true

示例2

输入:t1 = [1, null, 2, 4], t2 = [3, 2]
输出:false

提示
树的节点数目范围为[0, 20000]。

考察重点
主要是考察二叉树的遍历——递归遍历(重点:递归遍历的边界问题)
(题目难度:低)

不多说,上代码,简洁明了

二叉树的定义

/**
 * Definition for a binary tree node.
 */

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

递归判断

    /**
     * 判断子树t2是否为t1的子树
     *
     * @param t1 主树
     * @param t2 子树
     * @return 返回判断结果
     */
    public static boolean checkSubTree(TreeNode t1, TreeNode t2) {
        //如果t2都遍历都null了,说明t2已经检查完了,则认为可以判定是t1子树了
        if (t2 == null) {
            return true;
        }
        //如果t1都遍历到空了,可以决定t2不是t1的子树
        if (t1 == null) {
            return false;
        }
        //如果这个Node刚好相等,则需要继续判断它的左子树和右子树是否也相等
        if (t1.val == t2.val) {
            return checkSubTree(t1.left, t2.left) && checkSubTree(t1.right, t1.right);
        } else {
            //如果不相等,则将判断的基础结点往下移动,右边和右边都需要移动
            return checkSubTree(t1.left, t2) || checkSubTree(t1.right, t2);
        }

    }

    作者:you-yu-ai(letcode的账号:忧与爱,博客园:心若向阳花自开)
    链接:https://leetcode-cn.com/problems/check-subtree-lcci/solution/8xing-dai-ma-jie-fa-by-you-yu-ai/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2021-03-26 13:31  心若向阳花自开  阅读(53)  评论(0编辑  收藏  举报