LeetCode.965-单一二叉树(Univalued Binary Tree)
这是悦乐书的第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中,最后判断HashSet的size是否等于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)的更多相关文章
- [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 ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
- 965. Univalued Binary Tree
题目来源: https://leetcode.com/problems/univalued-binary-tree/submissions/ 自我感觉难度/真实难度: 题意: 分析: 自己的代码: c ...
- [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 ...
- [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 ...
- 【Leetcode_easy】965. Univalued Binary Tree
problem 965. Univalued Binary Tree 参考 1. Leetcode_easy_965. Univalued Binary Tree; 完
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化
遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...
- 数据结构-二叉树(Binary Tree)
1.二叉树(Binary Tree) 是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成. 2.特数二 ...
随机推荐
- Linux修改mysql配置文件
1.首先需要知道mysql数据库安装在什么位置 2.查找配置文件位置 然后在根据这个目录,查看配置文件在哪里了(路径后面加上 --verbose --help|grep -A 1 'Default o ...
- CAP 与 注册中心
https://blog.csdn.net/fly910905/article/details/100023415 http://www.ruanyifeng.com/blog/2018/07/cap ...
- HDU6740 2019CCPC秦皇岛赛区 J. MUV LUV EXTRA
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6740思路:求小数部分后k位的真前后缀 倒着kmp就好 #include<bits/stdc++.h& ...
- 关于数字加载的动画 jquery
这是关于数字加载的一个动画,从0开始变化到设置的数字,依赖于jquery,效果如下所示 当然,数字要显示的位数是可以设置的,默认是全部位数的数字,设置显示位数可以直接传递参数,例如: html文件为: ...
- Spring整合MongoDB(转)
1.认识Spring Data MongoDB 之前还的确不知道Spring连集成Nosql的东西都实现了,还以为自己又要手动封装一个操作MongoDB的API呢,结果就发现了Spring Data ...
- HGOI 20191106
HGOI 20191106 t1 旅行家(traveller) 2s,256MB [题目背景] 小X热爱旅行,他梦想有一天可以环游全世界-- [题目描述] 现在小X拥有n种一次性空间转移装置,每种装置 ...
- [转载]blktrace分析IO
前言 上篇博客介绍了iostat的一些输出,这篇介绍blktrace这个神器.上一节介绍iostat的时候,我们心心念念希望得到块设备处理io的service time,而不是service time ...
- Springboot(九).多文件上传下载文件(并将url存入数据库表中)
一. 文件上传 这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储 ...
- HDU 2829 [Lawrence] DP斜率优化
解题思路 首先肯定是考虑如何快速求出一段铁路的价值. \[ \sum_{i=1}^k \sum_{j=1, j\neq i}^kA[i]A[j]=(\sum_{i=1}^kA[i])^2-\sum_{ ...
- Spring boot之使用freemarker
大纲 (1)在pom.xml中引入freemarker; (2)如何关闭freemarker缓存 (3)编写模板文件.ftl (4)编写访问文件的controller 在pom.xml中引入freem ...