遍历递归: c++
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
// A B 树空
if(A == nullptr || B == nullptr){
return false;
}
return iscontain(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B); // 先判断当前遍历的两个节点开始的树一样吗, 不一样则继续判断主树A的下一个节点(左、右节点)
}
private:
bool iscontain(TreeNode* A, TreeNode* B){
if(B == nullptr){
return true; // B树节点比较完毕,配对
}
if(A == nullptr || A->val != B->val){
return false; // B树节点不为空但A树节点已为空,或两数节点都不为空,但值不同,不配对
}
return iscontain(A->left, B->left) && iscontain(A->right, B->right); // 当前节点比较完毕,比较下一个节点(A树左节点与B树左节点相同 且 A树右节点与B树右节点相同)
}
};
python
class Solution:
def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
def isContain(A, B):
if not B:
return True
if not A or A.val != B.val:
return False
return isContain(A.left, B.left) and isContain(A.right, B.right)
if not A or not B:
return False
return isContain(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B) # 继续找A的节点,直到与B的根配对



