输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
来自:leetcode网站剑指offer第26题 树的子结构
下面给出两种解法,首先是自己的非递归解法,然后是leetcode一大佬的递归解法。
非递归解法:
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null || B==null) return false;
Queue<TreeNode> queue = new LinkedList();
queue.offer(A);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(node.val == B.val){//定位到了
Queue<TreeNode> qB = new LinkedList();
Queue<TreeNode> qA = new LinkedList();
qB.offer(B);
qA.offer(node);
TreeNode bN = B;
while(!qB.isEmpty() && !qA.isEmpty()){
bN = qB.poll();
TreeNode aN = qA.poll();
if(bN.val==aN.val){
if(bN.left!=null){
if(aN.left!=null){
if(bN.left.val!=aN.left.val){
break;
}else{
qB.offer(bN.left);
qA.offer(aN.left);
}
}else{
break;
}
}
if(bN.right!=null){
if(aN.right!=null){
if(bN.right.val!=aN.right.val){
break;
}else{
qB.offer(bN.right);
qA.offer(aN.right);
}
}else{
break;
}
}
}
else{
break;
}
}
if(qB.isEmpty() && bN.left==null && bN.right==null){
return true;
}
}
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
return false;
}
leetcode一大佬的递归解法:
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}
boolean recur(TreeNode A, TreeNode B) {
if(B == null) return true;
if(A == null || A.val != B.val) return false;
return recur(A.left, B.left) && recur(A.right, B.right);
}