【OJ - 二叉树】单值二叉树

本文介绍了如何通过递归遍历方法解决LeetCode上的965题——单值二叉树。解题思路是首先检查当前节点是否为空,然后比较当前节点与其左右子节点的值,如果所有节点值相同则为单值二叉树。递归过程中,先判断根节点,再分别判断左右子树,直至所有节点都满足条件。
摘要由CSDN通过智能技术生成

【OJ - 二叉树】单值二叉树


LeetCode链接: 965. 单值二叉树 - 力扣(LeetCode)
题目难度:简单

一、题目描述

如果二叉树每个节点都具有相同的值,那么该二叉树就是 单值 二叉树。

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

image-20220220215447604

二、解题思路

二叉树的递归遍历,一般都会把问题拆分成 当前树(根节点)子树,然后子树又进行拆分,来解决问题。

核心思路

  1. 先判断当前节点是否为空,如果为空,返回 true(空树也满足单值二叉树的条件)

  2. 判断当前树是不是单值二叉树:

    1. 先判断当前节点的左孩子是否为空;
    2. 当前节点的值左孩子的值 进行比较,如果相等,在右孩子不为空的情况下,继续与 右孩子的值 进行比较;
    3. 如果不相等,说明 当前树 不是单值二叉树,返回 false。
  3. 继续往下递归遍历,判断当前节点的左右子树是不是单值二叉树。

递归过程演示

如果 a == b && a == c 为真,说明 1 是单值二叉树。

分而治之,不断迭代,先判断 1 是不是单值二叉树,再判断 2 是不是单值二叉树,最后判断 3 是不是单值二叉树。

image-20220220220732384
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


bool isUnivalTree(struct TreeNode* root){
    // 1. 先判断当前节点是否为空
    if(root == NULL)
    {
        return true; // 空树满足单值二叉树的条件
    }

    // 2. 判断当前节点和其左右孩子是否是单值二叉树
    // 先判断当前节点的左孩子是否为空,并将当前节点的值与左孩子的值进行比较,看是否相等,
    // 如果相等,则继续往下遍历;如果不相等,说明不是单值二叉树,则返回false。
    if(root->left && root->val != root->left->val)
    {
        return false;
    }

    if(root->right && root->val != root->right->val)
    {
        return false;
    }

    // 3. 往下遍历,判断当前节点的左右子树是不是单值二叉树
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

代码中有个小思路,我们 if 的条件写的是,如果左孩子不为空,且当前节点的值 != 左孩子的值,则返回 false,那为什么不写成:如果左孩子不为空,且当前节点的值 == 左孩子的值,则怎么怎么样……呢?因为写 ==,不能直接得出一个结果,而写 !=,就能得出结果 flase。


评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值