思路:
递归中套递归;
子树不一定就是A树根节点root1开始,需要前序遍历A的每个节点———递归1
以遍历时A的当前节点root1为起点,判断B是否是当前root1的子树———递归2
每次从遍历A时root1出发,调用递归2去判断B是否为root1的子树,若root1和B的根节点不等,则无需再递归,直接false,即当前两个树的根节点都不一样;
当root1和root2等时,才开始向下递归
Java实现:
import java.util.*;
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null){
return false; // 先过滤A、B存在null都返回false
}
//前序遍历
//遍历A,以当前root1为起点,去判断B是否为root1的子树,
boolean a=check(root1,root2);
//递归遍历A的子节点
boolean left=HasSubtree(root1.left,root2);
boolean right=HasSubtree(root1.right,root2);
return a || left || right; // 任一种情况true则true
}
//判断B是否为A子树
Boolean check(TreeNode root1,TreeNode root2){
if(root1==null && root2==null){ //终止条件,传进来的A B不可能都是null,前面已过滤掉
return true;
}
if(root1!=null && root2==null){ //A还没遍历完,B已经没了,说明B是A的一部分,则true !!!
return true;
}
if(root1==null && root2!=null){ //A都遍历完,B还有, 说明B有多余的,
return false;
}
//遍历树 前序
if(root1.val!=root2.val){
return false;
}
Boolean left=check(root1.left,root2.left);
Boolean right=check(root1.right,root2.right);
return left && right;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89269.html