解法:迭代
思想:
遍历A的每个节点,只要以任一节点为根的树”包含“B,就成功
注意:
●isSubStructure中,题目中说了空树不是任一树的子结构,要注意,要与面试官沟通空树的情况
●iscontain中,A需要包含B,所以B有的A一定要有,B无的A无所谓
代码:
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
//题目中说了空树不是任一树的子结构
if(B == NULL || A == NULL)
return false;
//A以当前节点包含B就返回true,如果不包含,说明当前节点没用,用A的left和right来判断
//我一开始写成三个iscontain了,感觉还是有点混乱,要记住
return iscontain(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
//包含:以A为根的数是否包含B(必须从A开始)
bool iscontain(TreeNode* A, TreeNode* B){
//B为空,A无所谓,返回true
if(B == NULL)
return true;
//此时B不为空,A为空或者值不相等,返回false
if(A == NULL || A->val != B->val)
return false;
//当前节点成功,两个子节点都成功的话,就返回true
return iscontain(A->left, B->left) && iscontain(A->right, B->right);
}
};