力扣【二叉树专题】👊 965. 单值二叉树

425 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 7 天,点击查看活动详情

题目链接

965. 单值二叉树 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

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

测试用例

示例 1:

image.png

输入:[1,1,1,1,1,null,1]
输出:true

限制

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

题目分析

题目对单值二叉树的定位即为:树中所有的节点的值,全部相等

最简单的一种解法,完整的遍历一次二叉树,用 let set = new Set() 储存下所有的节点的值,最后判断 set 中元素的个数是否为 1,即可知道此树是否为题目所需要的单值二叉树

代码实现

上一步的分析中,计划使用 Set 的特性来判断节点的不同的值的情况,需要完整的遍历一次树。

可以优化为,使用一个变量 val 记录下 root 的值,引入一个 flag = true 默认此树为单值树

然后开始对树进行递归遍历:每次遍历到节点时,将节点的值与开头记录的 val 进行比较,一旦值不相等,则修改 flag = false 并终止树的递归(因为已经没有必要去继续校验后续的节点的值了)

这种改进方案的优势在于,只要发现其中一个节点的值不同,立马终止递归校验,提高效率

var isUnivalTree = function(root) {
    let val = root.val;
    let flag = true;
    trave(root);
    return flag;

    function trave(node) {
        if (node == null || flag == false) return;
        if (node.val != val) {
            flag = false;
            return;
        }
        trave(node.left);
        trave(node.right);
    }
};

image.png