题目地址:572. 另一棵树的子树
该题的本质其实就是对比两棵树是否相同,可以参考 100. 相同的树,所以基本的对比逻辑就已经定好了:
public boolean isMatch(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}
if(p == null || q == null){
return false;
}
return p.val == q.val && isMatch(p.left, q.left) && isMatch(p.right, q.right);
}
需要注意的点就是如何去找子树?
思路如下:使用subRoot去进行匹配root,从root的根节点开始,然后依次递归root左子树、root右子树,直到将root遍历完毕。
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root == null){
return false;
}
return isMatch(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
private boolean isMatch(TreeNode root, TreeNode subRoot){
// 两棵树同时为空,说明到底了
if(root == null && subRoot == null){
return true;
}
if(root == null || subRoot == null){
return false;
}
return root.val == subRoot.val && isMatch(root.left, subRoot.left) && isMatch(root.right, subRoot.right);
}
解题要点:上述代码中,实际干活的实际就只有
isMatch(root, subRoot)这个方法,递归调用isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)的目的也是为了执行isMatch(root, subRoot),让subRoot可以和root中的每个子树可以做对比。