Problem:
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s.
A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree s could also be considered as a subtree of itself.
Explanation:
判断树t是否为树s的子树。
My Thinking:
使用递归,遍历每个结点,对每个结点为根的子树与s相比较。
My Solution:
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
return traverse(s,t);
}
public boolean traverse(TreeNode s,TreeNode t){
if(s==null)
return false;
if(isEqual(s,t))
return true;
return traverse(s.left,t) || traverse(s.right,t);
}
public boolean isEqual(TreeNode s,TreeNode t){
if((s==null && t!=null)||(s!=null && t==null))
return false;
if(s==null && t==null)
return true;
if(s.val!=t.val)
return false;
return isEqual(s.left,t.left) && isEqual(s.right,t.right);
}
}
Optimum Thinking:
使用前序遍历s和t,判断t是否是s的子集,但是需要把孩子为null也考虑进去。
Optimum Solution:
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
String ts=preOrder(s,true);
String tt=preOrder(t,true);
return ts.indexOf(tt)>=0;
}
public String preOrder(TreeNode t,boolean left){
if (t == null) {
if (left)
return "lnull";
else
return "rnull";
}
return "#"+t.val + " " +preOrder(t.left, true)+" " +preOrder(t.right, false);
}
}