二叉树检查子树
题目描述
检查子树。你有两棵非常大的二叉树: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。