leetcode
leetcode 851 ~ 900
单值二叉树

单值二叉树

难度:

标签:

题目描述

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

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

 

示例 1:

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

示例 2:

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

 

提示:

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

代码结果

运行时间: 23 ms, 内存: 0.0 MB


/*
 * 思路:
 * 1. 使用Java Stream API来遍历二叉树。
 * 2. 将树的所有节点值收集到一个列表中。
 * 3. 检查列表中的所有值是否相同。
 */

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Solution {
    public boolean isUnivalTree(TreeNode root) {
        if (root == null) return true;
        List<Integer> values = new ArrayList<>();
        collectValues(root, values);
        return values.stream().distinct().count() == 1;
    }

    private void collectValues(TreeNode node, List<Integer> values) {
        if (node == null) return;
        values.add(node.val);
        collectValues(node.left, values);
        collectValues(node.right, values);
    }
}

解释

方法:

该题解采用了迭代的方式来遍历树,以判断是否所有节点的值都相同。首先,方法定义了一个目标值 targetValue,它是树根节点的值。然后,使用一个栈来存储待检测的树节点。循环会持续到栈为空,每次循环中,从栈中弹出一个节点并检查其值是否等于目标值。如果不等,则立即返回 False。如果相等,则将该节点的左右子节点(如果存在)加入栈中继续检查。如果所有节点检查完毕,且都与目标值相同,则返回 True。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在迭代遍历中,为什么选择使用栈而不是队列?这对算法的效率有什么影响?
在迭代遍历中选择使用栈而不是队列,主要是因为栈提供了后进先出的特性,这使得算法可以深度优先遍历二叉树。使用栈进行深度优先遍历(DFS)通常在内存使用上更加高效,因为它只需要保持当前路径上的节点,而不像宽度优先遍历(使用队列实现)那样可能需要存储整层节点。此外,对于某些问题,DFS可能更快找到解决方案,尤其是在树的结构不平衡时。然而,对于单值二叉树的检查,使用栈或队列的效率差异不大,因为无论如何都需要访问所有节点。
🦆
如何处理树中存在null节点的情况,尤其是对于非满二叉树?
在本题解中,null节点不会被加入栈中。在迭代过程中,只有当节点存在(即非null)时,才会将其左右子节点加入栈中进行后续的值比较。这种处理方式确保了算法不会在null节点上执行无意义的操作,同时也防止了可能的空指针异常。因此,这种方法自然而然地处理了非满二叉树中的null节点。
🦆
在该迭代方法中,如果初始根节点是null,该如何处理?
如果初始根节点是null,根据题目的定义,空树不包含任何节点,因此可以认为它是单值二叉树(因为没有任何不符合条件的节点)。在实现中,应该在开始遍历前先检查根节点是否为null。如果是null,直接返回True表示这是一个单值二叉树。这样的处理可以避免后续的空指针错误,并且是逻辑上正确的处理方式。

相关问题