版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zm13007310400/article/details/81193393
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
时间限制:1秒 空间限制:32768K 热度指数:271259
解答:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {//1.两个都是空树,2.其中一个是空树 3.是子结构 4.不是子结构 第一步先找到A树中与B树根节点相等的节点; 第二步:当找到这个节点后,比较他们两的子树
//是否具有相同的结构。如果不相同,再继续去遍历A树,找到下一个与B树根节点相同的节点,再继续比较下去。。。
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if (null == root1 || null == root2) {
return false;
}
boolean result = false;
if (root1.val == root2.val) {//如果相等,表示找到了A树中与B二叉树的根节点的值相等的节点,接下来比较他们的左右子节点是否相等
result = isEqual(root1, root2);
if (!result) {//如果刚刚找到的与B根节点相等的A子树与B树的结构不相等时,继续遍历左子树
result = HasSubtree(root1.left, root2);
}
if (!result) {//如果刚刚找到的与B根节点相等的A子树与B树的结构不相等时,继续遍历右子树
result = HasSubtree(root1.right, root2);
}
}
return result;
}
private boolean isEqual(TreeNode root1, TreeNode root2) {
if (root2 == null) {//当root2此时为null时,表示B树遍历到叶子节点了都没出现不相等的情况,返回true
return true;
}
if (root1 == null) {//当root1为null,此时root2还不为null,确定这不是相同的结构
return false;
}
if (root1.val != root2.val) {//当两棵树比较的节点不相等时,确定不是相同的结构
return false;
}
return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
}
}