题目
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制:
0 <= 节点个数 <= 10000
解题思路
1.题目要求我们判断B是不是A的子结构,我们用递归来解决这个问题。
2.二叉树 B 为 A 的子结构的情况一共有三种,满足其中一种即可:
①子结构 B 的起点为 A 的根节点,即从 A 的根节点开始和 B 比较, 调用函数 isSubStree:
- 不相等,则返回 false;
- 相等,则再比较 左子树和右子树都是否相等,都相等,才返回 true
②子结构 B 在 A 的左子树中,即 B 的起点隐藏在 A 的左子树中,此时调用函数 isSubStructure;
③子结构 B 在 A 的右子树中,即 B 的起点隐藏在 A 的右子树中,此时调用函数 isSubStructure。3.举个例子:
我们先从 A 的根节点开始和 B 比较,调用函数 isSubStree:
根节点相等,则再比较 左子树和右子树都是否相等,都不1相等,返回 false。
我们猜测子结构 B 在 A 的左子树中,即 B 的起点隐藏在 A 的左子树中,此时调用函数 isSubStructure
在左子树中调用函数 isSubStree,根节点都不同则返回 false;再往左子树走,
依旧不同,此时我们返回上一级,去看看右子树
也不同,此时A的左子树全部检索完毕,我们需要检索右子树
这时我们调用函数 isSubStree,根节点相等,则再比较 左子树和右子树都是否相等,都相等,返回 true。代表我们找到了子结构。
代码实现
lass Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null){
return false;
}
if(isSubTree(A, B)){
return true;
}
if(isSubStructure(A.left, B) || isSubStructure(A.right, B)){
return true;
}
return false;
}
boolean isSubTree(TreeNode TA, TreeNode TB){
if(TB == null){
return true;
}
if(TA == null){
return false;
}
if(TB.val != TA.val){
return false;
}
return isSubTree(TA.left , TB.left) &&
isSubTree(TA.right, TB.right);
}
}
测试结果