LeetCode 572
2020.8.17
我的通过代码
/**
* 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 {
public boolean isSubtree(TreeNode s, TreeNode t) {
if(s==null&&t==null) return true;
if(s==null||t==null) return false;
return traverse(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t);
}
boolean traverse(TreeNode s, TreeNode t) {
if(s==null&&t==null) return true;
if(s==null||t==null) return false;
if(s.val == t.val) {
return traverse(s.left,t.left)&&traverse(s.right,t.right);
}
return false;
}
}
这题并不难,就是要注意递归时如果失败一定要能回到递归起点,并从它的左右孩子节点继续往下递归即可。
这题我还尝试了另一种方法,对两棵树分别进行先序遍历,并把空的左孩子补为 “LNULL”,空的右孩子补为 “RNULL”,然后进行字符串的匹配,如果可以匹配成功,就说明给定的两棵树符合题目的要求。
/**
* 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 {
String ss = "";
String tt = "";
public boolean isSubtree(TreeNode s, TreeNode t) {
traverseSS(s);
traverseTT(t);
if(ss.indexOf(tt)>-1) return true;
else return false;
}
void traverseSS(TreeNode s) {
if(s.left==null&&s.right!=null) {
ss = ss.concat(","+String.valueOf(s.val));
ss = ss.concat(",LNULL");
traverseSS(s.right);
}
if(s.left!=null&&s.right==null) {
ss = ss + "," + String.valueOf(s.val);
traverseSS(s.left);
ss+=",RNULL";
}
if(s.left!=null&&s.right!=null) {
ss = ss+","+String.valueOf(s.val);
traverseSS(s.left);
traverseSS(s.right);
}
if(s.left==null&&s.right==null) {
ss = ss + "," + String.valueOf(s.val);
ss+=",LNULL";
ss+=",RNULL";
}
}
void traverseTT(TreeNode s) {
if(s.left==null&&s.right!=null) {
tt = tt.concat(","+String.valueOf(s.val));
tt = tt.concat(",LNULL");
traverseTT(s.right);
}
if(s.left!=null&&s.right==null) {
tt = tt+","+String.valueOf(s.val);
traverseTT(s.left);
tt+=",RNULL";
}
if(s.left!=null&&s.right!=null) {
tt = tt+","+String.valueOf(s.val);
traverseTT(s.left);
traverseTT(s.right);
}
if(s.left==null&&s.right==null) {
tt = tt+","+String.valueOf(s.val);
tt+=",LNULL";
tt+=",RNULL";
}
}
}
就是效率不太高,执行时间35ms,可能使用KMP算法会好一些。