题目链接
检查子树
题目描述
注意点
- 树的节点数目范围为[0, 20000]
解答思路
- 递归判断t1和t2的val是否相同,如果相同,则继续递归判断其左右子树的值是否都相同,如果都相同则返回true;如果不相同,则继续递归判断t1的左右子树和t2的val是否相同
- 需要注意的是,如果t1和t2的val相同,在判断其左右子树的值是否相同时,如果不同,则直接返回false;而在判断t1和t2的val不同时,不应该直接返回false,还需要判断t1的左右子树与t2是否相同,所以还需要传递isRoot记录t2是否是根节点
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean checkSubTree(TreeNode t1, TreeNode t2) {
return preOrder(t1, t2, true);
}
public boolean preOrder(TreeNode t1, TreeNode t2, boolean isRoot) {
if (t1 == null && t2 == null) {
return true;
}
if (t1 == null || t2 == null) {
return false;
}
if (t1.val != t2.val) {
if (!isRoot) {
return false;
}
return preOrder(t1.left, t2, isRoot) || preOrder(t1.right, t2, isRoot);
}
boolean flag = preOrder(t1.left, t2.left, false) && preOrder(t1.right, t2.right, false);
if (flag) {
return true;
}
return preOrder(t1.left, t2, isRoot) || preOrder(t1.right, t2, isRoot);
}
}
关键点
- 递归的思路
- 注意递归判断t1的某个节点和t2的根节点、t1的某个节点和t2和某个节点不相同的分类情况