目录
一.题目
1.题目详情
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
要求:如果存在,返回 true
;否则,返回 false
。
示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true
二.解题思路
1.使用深度优先搜索先找root中的subroot的根结点
2.然后判断基于该结点的两个树是否相等
三.代码
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
return dfs(s, t);
}
public boolean dfs(TreeNode s, TreeNode t) {//找到root与subroot根节点相同的结点
if (s == null) {
return false;
}
return check(s, t) || dfs(s.left, t) || dfs(s.right, t);
}
public boolean check(TreeNode s, TreeNode t) {//判断两个树是否相等
if (s == null && t == null) {
return true;
}
if (s == null || t == null || s.val != t.val) {
return false;
}
return check(s.left, t.left) && check(s.right, t.right);
}
}
四.题后语(/(ㄒoㄒ)/~~)
我一开始的想法是,将两个树用先序遍历的方式转换为一个列表,然后通过判断是否第一个列表里面是否存在第二个列表的方式来判断是否subroot是否是root的子树,代码附再后面。这个方法我运行时是没有通过第二组测试数据。不知道是什么原因,大佬可以帮我看看。然后就是看的解析,解析的方法一是直接通过dfs直接暴力对比求得结果,方法二感觉跟我的方法有点像有有些不一样,没有理解。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List rootList = new ArrayList();
List subrootList = new ArrayList();
public void preorder(TreeNode root){
if(root==null){
rootList.add(root);
return;
}else{
rootList.add(root);
preorder(root.right);
preorder(root.left);
}
}
public void subpreorder(TreeNode root){
if(root==null){
subrootList.add(root);
return;
}else{
subrootList.add(root.val);
preorder(root.right);
preorder(root.left);
}
}
public boolean rootsub(List rootList,List subrootList){
boolean flag=true;
for(int j=0;j<rootList.size();j++){
int i=0;
if(rootList.get(j)==subrootList.get(i)){
for(int n=1;n<subrootList.size();n++){
if(rootList.get(j+n)!=subrootList.get(i+n)){
flag=false;
}
}
}
}
return flag;
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
subpreorder(subRoot);
preorder(root);
return rootsub(rootList,subrootList);
}
}