(思路参考了网上的帖子,如有侵权请及时联系)
题目:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
比较A和B的根节点是否相同,若相同比较它们的左右子树是否相同,直到比较完B的所有叶子节点,若都相同,返回true;若A的跟节点和B的根节点不同,则A向左右子树滑动继续和B比较。
步骤:
如果A和B根节点相同,左右节点相同,则A,B都移到它们的左右子节点继续比较;
如果A和B根节点相同,左右节点不同,移动A到它的左右子节点继续和B的根节点开始比较
如果A和B根节点不同,A移到它的左右节点再和B的跟节点比较
代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root2 == null){//B是空树
return false;
}
if(root1 == null){//A是空树
return false;
}
if(root1.val == root2.val){//A和B根节点相同
if(root2.left == null && root2.right == null){//如果比较到了B的叶子节点,递归结束,返回true
return true;
}
//左右节点相同的三种情况
if((root1.left != null && root1.right != null) && (root2.left != null && root2.right != null) && (root1.left.val == root2.left.val && root1.right.val == root2.right.val)){
return HasSubtree(root1.left, root2.left) && HasSubtree(root1.right, root2.right);
}
else if((root1.left != null && root1.right == null) && (root2.left != null && root2.right == null)&&(root1.left.val == root2.left.val)){
return HasSubtree(root1.left, root2.left);
}
else if((root1.left == null && root1.right != null) && (root2.left == null && root2.right != null)&&(root1.right.val == root2.right.val)){
return HasSubtree(root1.right, root2.right);
}else {//左右节点不同的情况,移动A到它的左右子节点继续和B的根节点开始比较
if(root1.left != null && root1.right != null){
return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
else if(root1.left != null && root1.right == null){
return HasSubtree(root1.left, root2);
}
else if(root1.left == null && root1.right != null){
return HasSubtree(root1.right, root2);
}
else{
return false;
}
}
}else if(root1.left!=null&&root1.right==null){
return HasSubtree(root1.left,root2);
}else if(root1.left==null&&root1.right!=null){
return HasSubtree(root1.right,root2);
}else{
return false;
}
}
}