当前位置: 首页 > news >正文

leetcode---单值二叉树(递归遍历二叉树)

1.问题描述

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false

二、问题分析

解法1:

       递归遍历二叉树,如果二叉树的左右子树均为NULL则返回true;如果二叉树的左右子树中有一个是NULL同时非空的子树的值和其父节点的值相等,则递归判断非空子树的左右子树是否为NULL,否则返回false;如果二叉树的左右子树都不为NULL,则判断左右子树的值和其父节点的值是否都相等,如果都相等则递归判断左右子树的子树是否为NULL,否则返回false;

解法2:

       一棵二叉树是否为单值二叉树的条件是它的左右子树均是单值二叉树;左右子树是单值的二叉树的条件是左右子树为NULL或者左右子树的值都等于父节点的值且左右子树的左右子树的也为单值二叉树。

三、代码描述

解法1:

bool isUnivalTree(struct TreeNode* root){
    //如果一棵树的左右子树都为空,返回真
    if(root == NULL || (root->right == NULL && root->left == NULL))
        return true;
    else if(root->right == NULL || root->left == NULL)
    {
        //如果有一个为空,当非空节点的值等于跟节点的值时返回真,并继续遍历其子节点
        struct TreeNode* nonNullNode = root->left;
        if(root->right != NULL)
        {
            nonNullNode = root->right;
        }
        //如果非空节点的值等于其父亲节点的值,则返回其左右子树的判断结果
        if(nonNullNode->val == root->val)
        {
            return isUnivalTree(root->right) && isUnivalTree(root->left);
        }
        else
        {
            return false;
        }
    }
    //如果一棵树的左右子树的节点都不为空,判断左右子节点是否等于父节点
    else
    {
        if(root->val == root->left->val && root->val == root->right->val)
        {
            return isUnivalTree(root->right) && isUnivalTree(root->left);
        }
        else
        {
            return false;
        }
    }
    
}

解法2:

bool isUnivalTree(struct TreeNode* root){
    bool left = (root->left == NULL || (root->left->val == root->val && isUnivalTree(root->left)));
    bool right = (root->right == NULL || (root->right->val == root->val && isUnivalTree(root->right)));
    return right && left;
}

 

相关文章:

  • c语言不同数据类型之间的运算(隐式转换、整型提升、强制类型转换、不同类型之间的运算)
  • C语言switch中default的使用
  • 数据结构---排序(插入排序、希尔排序、堆排序、选择排序、冒泡排序、快速排序、归并排序、计数排序)
  • Linux---centos常用开发工具(vim、gcc/g++、gdb、Makefile、git)
  • Linux进度条程序(模拟实现进度条)
  • 最全的《剑指offer》题目解析---C++
  • C/C++中static的作用(修饰局部变量、修饰全局变量、修饰函数)
  • C++ ---入门基础知识( 命名空间、函数重载、引用、缺省参数、内联函数)
  • 剑指offer---二维数组中的查找
  • 剑指offer---替换空格
  • 剑指offer---第一个只出现一次的字符
  • C++ ---类和对象(上)
  • C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用
  • C++ --- 类和对象(中)
  • 剑指offer---旋转数组的最小的数字
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • angular2开源库收集
  • extract-text-webpack-plugin用法
  • JSONP原理
  • js如何打印object对象
  • PHP那些事儿
  • Web标准制定过程
  • 安卓应用性能调试和优化经验分享
  • 初识 beanstalkd
  • 多线程 start 和 run 方法到底有什么区别?
  • 反思总结然后整装待发
  • 记一次和乔布斯合作最难忘的经历
  • 将 Measurements 和 Units 应用到物理学
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 通信类
  • 应用生命周期终极 DevOps 工具包
  • 智能合约Solidity教程-事件和日志(一)
  • 终端用户监控:真实用户监控还是模拟监控?
  • MyCAT水平分库
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​插件化DPI在商用WIFI中的价值
  • #14vue3生成表单并跳转到外部地址的方式
  • #DBA杂记1
  • #if #elif #endif
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma once与条件编译
  • #WEB前端(HTML属性)
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (13)Hive调优——动态分区导致的小文件问题
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (Python第六天)文件处理
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (windows2012共享文件夹和防火墙设置
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)http-server应用