这类型的二叉树主要分为两个类型:1.不需要构建辅助函数 2.需要构建辅助函数
光是谈理论有点空洞,我归纳了以下几个题目作为日后参考:
题1 相同的树
条件:判断两个树是否相同
判断依据:如果两棵树都是空树,必然相同;如果其中有一棵树不为空,那么必不相同
判断标准:两棵树都非空&&根节点相同&&左子树相同&&右子树相同
c++:
bool isSametree(TreeNode*p, TreeNode*q){
if(!p&&!q){ return true;}
return p&&q&&p->val==q->val&&(isSametree(p->left,q->left))&&(isSametree(p->right,q->right));
}
题2
条件:判断一个树是不是另一个树的子树
判断依据:先判断两棵树是否相同,然后判断一个树的左(右)子树是否是另一棵树的子树
判断标准:一棵树的左子树是另一棵树的子树||一棵树的右子树是另一棵树的子树
c++:
bool isSubtree(TreeNode* root1,TreeNode* root2){
if(!root1||!root2){return false;}
if(isSametree(root1,root2)){return true;}
return (isSubtree(root1->left,root2)||isSubtree(root1->right,root2));
}
题3
条件:判断一棵树是否为对称二叉树
判断依据:构建一个辅助函数判断两棵树是否为镜像对称
判断标准:根节点相同&&一棵树的左子树等于另一棵树的右子树&&一棵树的右子树等于另一棵树的左子树
c++:
bool isSymetric(TreeNode*root){
return isMirror(root,root)
}
bool isMirror(TreeNode*p,TreeNode*q){
if(!p&&!q) return true;
if(!p||!q) return false;
return (p->val==q->val)&&(isMirror(p->left, q->right)) && (isMirror(p->right, q->left));
}
题4
条件:判断一棵树是否是另一棵树的子结构,注意子结构与子树的区别
判断依据:子结构不能只利用根节点进行对称性递归,需要构造辅助函数
判断标准:根节点相同进行&&A是不是B的左子树的子结构&&A是不是B的右子树的子结构
c++:
bool hasSubStructure(TreeNode*A, TreeNode*B)
{
if (!B)
return true;
if (!A || A->val != B->val)
return false;
return hasSubStructure(A->left, B->left) && hasSubStructure(A->right, B->right);
}
bool isSubStructure1(TreeNode<T> *A, TreeNode<T> *B)
{
if (!A || !B)
return false;
return hasSubStructure(A, B) || isSubStructure1(A->left, B) || isSubStructure1(A->right, B);
}