单值二叉树(leetcode简单)+相同的树(leetcode简单)+对称二叉树(leetcode简单)

更新三个关于二叉树初阶的题

965. 单值二叉树

这个题的思路不止一种,首先可以遍历,还可以用返回值,本文只讲返回值的思路,遍历的代码如下版本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);
}

 100. 相同的树

 思路:

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);
}

总结一下,其实上面两个题的思路几乎是完全一样的

接下来这个题的思路也是几乎一样的,但是又稍微需要动点脑筋。

101. 对称二叉树

 思路:
这里比较不同的就是把改树的左右子树分离出来比较,因为没有办法同时去递归一棵树的两边,所以分为两棵树来比较,这就转换成了上一个题

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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值