当你的才华还撑不起你的野心时,你应该静下心去学习 。 |
---|
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
输入:A = [1,2,3], B = [3,1]
输出:false
解题思路
若树 B 是树 A 的子结构,则子结构的根节点可能为树 A 的任意一个节点。因此,判断树 B 是否是树 A 的子结构,需完成以下两步工作:
- 先序遍历树 A 中的每个节点 nA (对应函数 isSubStructure(A, B))
- 判断树 A 中 以 nA 为根节点的子树是否包含树 B (对应函数 recur(A, B))
参考代码
Java版本
class Solution {
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);
}
}
// 关注TechGuide,大厂笔经面经闪电速递!
CPP版本
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
return (A && B) && (recur(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B));
}
bool recur(TreeNode* A, TreeNode* B) {
if(!B) return true;
if(!A || A->val != B->val) return false;
return recur(A->left, B->left) && recur(A->right, B->right);
}
}
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧 |
---|