树的子结构
1.题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2.思路
要判断B是否是A的子结构,只需要从根节点开始判断,通过递归的方式比较A,B的每一个子节点即可,但实际上B如果是A的子结构的话,不一定是从根节点开始的,B不光有可能是A的子结构,也有可能是A左子树的子结构或者右子树的子结构,所以如果从根节点判断B是不是A的子结构,还要继续判断B是不是A左子树的子结构和右子树的子结构。
3.代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(A == NULL || B == NULL){
return false;
}
return isSame(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
bool isSame(TreeNode* A, TreeNode* B){
if(B == NULL){
return true;
}
if(A == NULL){
return false;
}
if(A->val != B->val){
return false;
}
return isSame(A->left, B->left) && isSame(A->right, B->right);
}
};
4.复杂度分析
时间复杂度:O(mn)。在最坏的情况下(倾斜树)traverse 需要 O(mn)时间。
空间复杂度:O(n),递归树的深度可以达到 n。n 表示 s 中的节点数。