题目一
题目描述
思路:和上篇博客检查两棵树是否相同思路非常类似,判断一棵树是否是对称二叉树关键就是比较左子树的根和右子树的根是否相等,然后递归往后走
步骤
1.左子树的根和右子树的根均为空,返回true
2.左子树的根和右子树的根有一个不为空,返回false
3.左子树根的值和右子树根的值不相等,返回false
4.递归比较
代码实现
bool _isSymmetric(struct TreeNode* leftRoot,struct TreeNode* rightRoot){
//都为空
if(leftRoot == NULL && rightRoot == NULL)
{
return true;
}
//一个为空
if(leftRoot == NULL || rightRoot == NULL)
{
return false;
}
//不相等
if(leftRoot->val != rightRoot->val)
{
return false;
}
//递归
return _isSymmetric(leftRoot->left,rightRoot->right)
&& _isSymmetric(leftRoot->right,rightRoot->left);
}
bool isSymmetric(struct TreeNode* root){
return _isSymmetric(root->left, root->right);
}
ps:为了用代码实现我们的解题思路,我们手动添加_isSymmetric()函数,在题目给定函数调用即可
ps: _函数,一般代表该函数的一个辅助函数
·································································································································
题目二
题目描述
思路:调用上篇博客实现过的判断两棵树是否相同的isSameTree()函数
subRoot树是root的子树有三种情况:
①subRoot树和root树相等
②subRoot树是root的左子树
③subRoot树是root的右子树
步骤:
1.判断root根是否为空,为空则返回false(题上说了subRoot不为空树)
2.判断root树和subRoot树是否相同
3.判断root的左子树和subRoot树是否相同
4.判断root的右子树和subRoot树是否相同
ps:2,3,4两点满足一点即可,因为是或的关系
代码实现
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(p == NULL && q == NULL)
{
return true;
}
if(p == NULL || q == NULL)
{
return false;
}
if(p->val != q->val)
{
return false;
}
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right) ;
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
{
return false;
}
if(isSameTree(root,subRoot))
{
return true;
}
return isSubtree(root->left,subRoot) || isSubtree(root->right, subRoot);
}
isSubtree()函数也可以这样写~
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
{
return false;
}
return isSameTree(root, subRoot) || isSubtree(root->left,subRoot)
|| isSubtree(root->right, subRoot);
}
本篇文章就分享到这了,欢迎大家交流指正~