这类型的二叉树主要分为两个类型: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);
}