package java_jianzhioffer_algorithm;
/**
* 题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
* @author hexiaoli
* 思考:
* 递归:先找到B的根元素在A中的位置,再判断树A中以root为根节点的子树是不是包含和树B一样的结构。
*/
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class HasSubtree {
public static boolean hasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if(root1 != null && root2 !=null) {
if(root1.val == root2.val) {
// 先找根节点是否满足
result = isEqual(root1, root2);
}
if(!result) {
// 如果根节点不满足,则找左子树
result = isEqual(root1.left, root2);
}
if(!result) {
// 如果左子树依旧不满足,则找右子树
result = isEqual(root1.right, root2);
}
}
return result;
}
public static boolean isEqual(TreeNode node1,TreeNode node2) {
if(node2 == null) {
return true;
}
if(node1 == null ) {
return false;
}
if (node1.val != node2.val) {
return false;
}
// 在根结点相同的情况下,比较该根节点下的左右子树是否相同
return isEqual(node1.left,node2.left)&&isEqual(node1.right,node2.right);
}
public static void main(String[] args) {
TreeNode head1 = new TreeNode(5);
TreeNode level1l = new TreeNode(4);
TreeNode level1r = new TreeNode(6);
TreeNode level2l = new TreeNode(3);
TreeNode level2r = new TreeNode(7);
head1.left = level1l;
head1.right = level1r;
level1l.left = level2l;
level1r.right = level2r;
TreeNode level1l2 = new TreeNode(4);
TreeNode level2l2 = new TreeNode(3);
level1l2.left = level2l2;
boolean result;
result = hasSubtree(head1, level1l2);
System.out.println(result);
}
}
剑指offer(17)树的子结构
猜你喜欢
转载自blog.csdn.net/hxl0925/article/details/89948382
今日推荐
周排行