更新三个关于二叉树初阶的题
这个题的思路不止一种,首先可以遍历,还可以用返回值,本文只讲返回值的思路,遍历的代码如下版本1和版本2,版本2在版本1的基础上做了优化。版本3是返回值的代码。
思路:
1.考虑二叉树根节点为空的情况,若空,返回真
2.考虑根的左右叶子是否相等,若相等,这里不能返回真,因为下面的还没有比较,但是若不相等,就可以直接返回假,然后继续往下走
3.若假,则开始递归下面的叶子。
//版本1
bool flag=true;
void PreOrderCompare(struct TreeNode* root,int val)
{
if(root==NULL)
return;
if(root->val!=val)
flag=false;
PreOrderCompare(root->left,val);
PreOrderCompare(root->right,val);
}
bool isUnivalTree(struct TreeNode* root){
if(root==NULL)
return true;
flag=true;
PreOrderCompare(root,root->val);
return flag;
}
//版本2
bool flag=true;
void PreOrderCompare(struct TreeNode* root,int val)
{
if(root==NULL||flag==false)
return;
if(root->val!=val)
{
flag=false;
return;
}
PreOrderCompare(root->left,val);
PreOrderCompare(root->right,val);
}
bool isUnivalTree(struct TreeNode* root){
if(root==NULL)
return true;
flag=true;
PreOrderCompare(root,root->val);
return flag;
}
//版本3
bool isUnivalTree(struct TreeNode* root){
if(root==NULL)
return true;
if(root->left&&root->left->val!=root->val)
return false;
if(root->right&&root->right->val!=root->val)
return false;
return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
思路:
1.首先两棵树,要给出除了两棵树都不为空树的三种情况来判断
2.接下来 还是和上面题的思路一样,相等则不能返回真,不相等直接返回假
3.若假,那则开始递归下面的叶子。
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(p==NULL&&q==NULL)
return true;
if(p==NULL&&q!=NULL)
return false;
if(q==NULL&&p!=NULL)
return false;
if(p->val!=q->val)
return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
总结一下,其实上面两个题的思路几乎是完全一样的
接下来这个题的思路也是几乎一样的,但是又稍微需要动点脑筋。
思路:
这里比较不同的就是把改树的左右子树分离出来比较,因为没有办法同时去递归一棵树的两边,所以分为两棵树来比较,这就转换成了上一个题
bool isSubSymmetric(struct TreeNode* p,struct TreeNode* q){
if(p==NULL&&q==NULL)
return true;
if(p==NULL&&q!=NULL)
return false;
if(q==NULL&&p!=NULL)
return false;
if(p->val!=q->val)
return false;
return isSubSymmetric(p->left,q->right)&&isSubSymmetric(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL)
return true;
return isSubSymmetric(root->left,root->right);
}