这是悦乐书的第366次更新,第394篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第228题(顺位题号是965)。如果树中的每个节点具有相同的值,则二叉树是单一的。当且仅当给定树是单一时才返回true

    1
/ \
1 1
/ \ \
1 1 1

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

输出: true

    2
/ \
2 2
/ \
5 2

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

输出: false

注意

  • 给定树中的节点数量将在[1,100]范围内。

  • 每个节点的值将是[0,99]范围内的整数。

02 第一种解法

题目的意思是判断二叉树中的节点值是否都是一个值,为同一个值就返回true,不是就返回false

思路:使用递归,中序遍历二叉树的每个节点,存入List中,再遍历比较List中的元素是否都等于二叉树的根节点值。

public boolean isUnivalTree(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
helper(root, list);
for (Integer num : list) {
if (num != root.val) {
return false;
}
}
return true;
} public void helper(TreeNode root, List<Integer> list) {
if (root == null) {
return ;
}
helper(root.left, list);
list.add(root.val);
helper(root.right, list);
}

03 第二种解法

针对第一种解法的递归方式,我们也可以换成迭代的方式,借助栈Stack来实现。

public boolean isUnivalTree2(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
list.add(node.val);
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
for (Integer num : list) {
if (num != root.val) {
return false;
}
}
return true;
}

04 第三种解法

在第二种解法的基础上,我们可以直接判断出栈的树的节点值是否等于根节点值,省掉存入List的步骤。

public boolean isUnivalTree3(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.val != root.val) {
return false;
}
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
return true;
}

05 第四种解法

既然判断节点值是否都是同一个值,那么可以借助HashSet去重的特性,使用递归,中序遍历节点值,存入HashSet中,最后判断HashSetsize是否等于1即可。

public boolean isUnivalTree4(TreeNode root) {
Set<Integer> set = new HashSet<Integer>();
helper(root, set);
return set.size() == 1;
} public void helper(TreeNode root, Set<Integer> set) {
if (root == null) {
return ;
}
helper(root.left, set);
set.add(root.val);
helper(root.right, set);
}

06 第五种解法

针对第四种解法,也可以通过迭代的方式的来实现,借助栈Stack

public boolean isUnivalTree5(TreeNode root) {
Set<Integer> set = new HashSet<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
set.add(node.val);
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
return set.size() == 1;
}

07 第六种解法

我们也可以直接用递归,不借助其他的类。

public boolean isUnivalTree6(TreeNode root) {
return help(root, root.val);
} public boolean help(TreeNode root, int num){
if (root != null && root.left == null
&& root.right == null && root.val == num) {
return true;
}
if (root != null && root.left == null) {
return root.val == num && help(root.right, num);
}
if (root != null && root.right == null) {
return root.val == num && help(root.left, num);
}
return root != null && root.val == num
&& help(root.right, num) && help(root.left, num);
}

08 第七种解法

针对上面的第六种解法,我们还可以再简化下。因为题目给了二叉树节点的数量范围,root是不会为空的,等于null表示当前没有继续可以向下遍历的节点了。

public boolean isUnivalTree7(TreeNode root) {
return helper(root, root.val);
} public boolean helper(TreeNode root, int num){
if (root == null) {
return true;
}
if (root.val != num) {
return false;
}
return helper(root.right, num) && helper(root.left, num);
}

09 小结

算法专题目前已连续日更超过七个月,算法题文章234+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.965-单一二叉树(Univalued Binary Tree)的更多相关文章

  1. [Swift]LeetCode965. 单值二叉树 | Univalued Binary Tree

    A binary tree is univalued if every node in the tree has the same value. Return true if and only if ...

  2. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java

    [LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...

  3. 965. Univalued Binary Tree

    题目来源: https://leetcode.com/problems/univalued-binary-tree/submissions/ 自我感觉难度/真实难度: 题意: 分析: 自己的代码: c ...

  4. [LeetCode] 111. Minimum Depth of Binary Tree 二叉树的最小深度

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  5. [LeetCode] 366. Find Leaves of Binary Tree 找二叉树的叶节点

    Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...

  6. 【Leetcode_easy】965. Univalued Binary Tree

    problem 965. Univalued Binary Tree 参考 1. Leetcode_easy_965. Univalued Binary Tree; 完

  7. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  8. 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化

    遍历二叉树   traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...

  9. 数据结构-二叉树(Binary Tree)

    1.二叉树(Binary Tree) 是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成.  2.特数二 ...

随机推荐

  1. vim简明教程(附快速记忆方法)

    vim分为四种模式: 普通模式(normal mode) 插入模式(insert mode) 可视模式(visual mode) 命令模式(excute mode) 下面整理了常用的快捷键和记忆方法( ...

  2. Django—ajax、前端后端编码格式,bulk_create批量插入语数据库、自定义分页

    一.ajax简介: XML也是一门标记语言该语法应用场景 1.写配置文件 2.可以写前端页面(odoo框架中 erp) 每家公司都会有属于这家公司独有的内部管理软件:专门用来开发企业内部管理软件 框架 ...

  3. 使用xpath提取页面所有a标签的href属性值

    # -*- coding: utf-8 -*- #1.选取节点 #获取所有的div元素 //div #/代表获取根节点的直接子元素 #获取所有带有id属性的div //div[@id] #2.谓词(索 ...

  4. Huber loss<转发>

    from https://blog.csdn.net/lanchunhui/article/details/50427055请移步原文

  5. jquery password选择器 语法

    jquery password选择器 语法 作用::password 选择器选取类型为 password 的 <input> 元素.大理石平台精度等级 语法:$(":passwo ...

  6. Python Internet 模块

    Python Internet 模块 以下列出了 Python 网络编程的一些重要模块: 协议 功能用处 端口号 Python 模块 HTTP 网页访问 80 httplib, urllib, xml ...

  7. [pwnable.kr]Dragon

    0x00: dragon 是一个UAF漏洞的利用. UseAfterFree 是堆的漏洞利用的一种 简单介绍 https://www.owasp.org/index.php/Using_freed_m ...

  8. HGOI20190810 省常中互测3

    Problem A  夏洛特 若当前处在点$(x,y)$下一时刻可以向该点四周任意方向走动一步, 初始在$(0,0)$是否存在一条合法的路线满足下列$n$个限制: 每一个限制形如$t_i , x_i ...

  9. flink⼿手动维护kafka偏移量量

    flink对接kafka,官方模式方式是自动维护偏移量 但并没有考虑到flink消费kafka过程中,如果出现进程中断后的事情! 如果此时,进程中段: 1:数据可能丢失 从获取了了数据,但是在执⾏行行 ...

  10. Unity3D_(游戏)卡牌02_主菜单界面

      启动屏界面.主菜单界面.选关界面.游戏界面 卡牌01_启动屏界面 传送门 卡牌02_主菜单界面 传送门 卡牌03_选关界面 传送门 卡牌04_游戏界面    传送门 主菜单界面 (选择左边图标或选 ...