题目描述:
一开始整出来的代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if(s == null && t == null){
return true;
}
Queue<TreeNode> tem = new LinkedList<>();
tem.add(s);
while (!tem.isEmpty()) {
int size = tem.size();
for (int i = 0; i < size; i++) {
TreeNode temnode = tem.poll();
if(is(temnode, t)){
return true;
}else {
if(temnode.left != null){
tem.offer(temnode.left);
}
if(temnode.right != null){
tem.offer(temnode.right);
}
}
}
}
return false;
}
public boolean is(TreeNode s,TreeNode t){
//进行判断s是否是t的子节点
Queue<TreeNode> stem = new LinkedList<>();
Queue<TreeNode> ttem = new LinkedList<>();
stem.offer(s);
ttem.offer(t);
while (!stem.isEmpty() && !ttem.isEmpty()) {
TreeNode sstem = stem.poll();
TreeNode tttem = ttem.poll();
if(sstem.val != tttem.val){
return false;
}
if(sstem.left == null){
if(tttem.left != null){
return false;
}
}
if(sstem.left != null){
if(tttem.left == null){
return false;
}else {
stem.offer(sstem.left);
ttem.offer(tttem.left);
}
}
if(sstem.right == null){
if(tttem.right != null){
return false;
}
}
if(sstem.right != null){
if(tttem.right == null){
return false;
}else {
stem.offer(sstem.right);
ttem.offer(tttem.right);
}
}
}
if(stem.isEmpty() && ttem.isEmpty()){
return true;
}else {
return false;
}
}
}
有点长,但是直接撸出来的,一次没调试
接下来尝试使用递归的方法
递归解法,比较生疏啊
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
//使用递归来完成
if( s == null && t == null){
return true;
}
if(s == null || t == null){
return false;
}
boolean stem = false;
if(s.val == t.val){
stem = is(s, t);
}
return stem || isSubtree(s.left, t) || isSubtree(s.right, t);
}
public boolean is(TreeNode s,TreeNode t){
if(s == null && t == null){
return true;
}
if(s == null || t == null || s.val != t.val){
return false;
}
return is(s.left, t.left) && is(s.right, t.right);
}
}
排名靠前的代码
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
return s != null && (isSameTree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t));
}
private static boolean isSameTree(TreeNode s, TreeNode t) {
return s == null && t == null || s != null && t != null && s.val == t.val && isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
}
}