题解 | #树的子结构#
树的子结构
https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88
class Solution {
private:
TreeNode* isSubtree(TreeNode* root1, TreeNode* root2){
/*
@当根节点相同时,判断剩下的节点是否相同
@return:
返回非空指针时,说明剩下的节点不完全相同;
返回空指针则说明是子树
*/
if(root2 == nullptr) return nullptr; // 树B 的子节点全部走完,说明所有节点全部相同了
else if(root1 == nullptr) return root2;// 树B未走完,但树A走完了,不对
if(root1->val == root2->val){
TreeNode* isLeftSubtree = isSubtree(root1->left, root2->left);
TreeNode* isRightSubtree = isSubtree(root1->right, root2->right);
if(isLeftSubtree == nullptr && isRightSubtree == nullptr){
return nullptr;
}
else{
return root2;
}
}
else{
return root2;
}
return nullptr;
}
bool Preoder(TreeNode* root1, TreeNode* root2){
bool is = false;
if(root1 == nullptr) return false;
if(root1->val == root2->val){
is = isSubtree(root1, root2) == nullptr;
}
return is || Preoder(root1->left, root2) || Preoder(root1->right, root2);
}
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(pRoot2 == nullptr) return false;
return Preoder(pRoot1, pRoot2);
}
};