单值二叉树

举报
芒果_Mango 发表于 2022/04/30 22:52:04 2022/04/30
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:


题目

965. 单值二叉树 - 力扣(LeetCode) (leetcode-cn.com)
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false。

示例 1:

输入:[1,1,1,1,1,null,1]
输出:true
示例 2:

输入:[2,2,2,5,2]
输出:false

提示:

给定树的节点数范围是 [1, 100]。
每个节点的值都是整数,范围为 [0, 99]

image-20220209214629743


方法1:

*思想:*先判断根的左右子树的值是否和根的值一致,如果一致,则去递归判断左右子树是否是单值二叉树


a == b b == c ==> a == c

==操作符具有传递性

  • 空树满足单值二叉树

    • if(root == NULL)
      {
          return true;
      }
      
  • 如果根节点不为空 ,就拿根的值和左子树,右子树的值比较是否一致。如果一致,再去递归左子树和右子树

    • 左右子树未知是否存在,所以要判断左右子树是否为空

    这样写没意义,左子树相等了,还要看右子树是否相等 拿不到直接结果

    if(root->left!=NULL && root -> left->val == root->val)
    

    应该写成这样

    if(root->left && root->left->val != root->val)
    {
        retunn false; 
    }
    

代码

bool isUnivalTree(struct TreeNode* root)
{
    //空树是单值二叉树
    if(root == NULL)
    {
        return true;
    }
    //判断左子树的值是否和根的值一致
    //要判断左子树是否存在
    //不相等,直接返回false
    if(root->left && root->left->val != root->val)
    {
        return false;
    }
    
    //判断右子树的值是否和根的值一致
    //要判断右子树是否存在
    //不相等,直接返回false
    if(root->right && root->right->val != root->val)
    {
        return false;
    }
    
    //如果左子树,右子树的值和根结点的值一致,左子树和右子树还要作为根继续往下递归
    //要保证左右子树都是单值二叉树,所以用&&
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

方法2:

思路用根节点的值和所有结点的值进行比较,类似前序遍历


代码

//前序遍历,找和根节点的值不同的结点
//遇到不相等的就返回1
int PreOrder(struct TreeNode* root,int val)
{
    //空树返回0
    if(root == NULL)
    {
        return 0;
    }
    //子树结点的值和根节点的值不相等,返回1
    if(root->val !=val)
    {
        return 1;
    }
    //递归左子树和右子树比较判断,是否有值不相同的结点
    return PreOrder(root->left,val)+PreOrder(root->right,val);
}
bool isUnivalTree(struct TreeNode* root)
{
    int val = root->val;
    //递归计数
    int tmp = PreOrder(root,val);//tmp接收左右子树有多少个结点的值和根节点的值不相同
    //如果tmp为0->所有结点完全相同->单值二叉树
    if(tmp == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
    
}

\

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。