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.特数二 ...
随机推荐
- java调用js函数
问题:js函数可能有多个,之间有相互调用关系,有jquery jar包 org.mozilla.javascript-1.7.2 js envjs-1.2.js java代码 import jav ...
- Newsgroups数据集研究
1.数据集介绍 20newsgroups数据集是用于文本分类.文本挖据和信息检索研究的国际标准数据集之一. 数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合. 一些新闻 ...
- 记一次生产环境nginx图片上传不了的问题
在server节点目录下配置: client_max_body_size 8M; client_body_buffer_size 8M; 不过还是不能上传就执行下面这条命令: cd /var/lib/ ...
- qt5--列表控件QListWidget
需要 #include <QListWidget> #include <QListWidgetItem> 列表控件可以让我们以列表形式呈现内容,是界面 ...
- #4 div1E Parentheses 括号匹配
E - Parentheses Time Limit:2000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Subm ...
- sh_11_字典的其他操作
sh_11_字典的其他操作 xiaoming_dict = {"name": "小明", "age": 18} # 1. 统计键值对数量 p ...
- ZOJ-3777-Problem Arrangement(状压DP)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意: 输入n和m,接下来一个n*n的矩阵,a[i][j]表示第i道 ...
- [笔记]mongodb一
一.MongoDB介绍 MongoDB是一个由c++编写的基于分布式文件存储的数据库.MongoDB介于关系型数据库和非关系型数据库之间,是非关系型数据库中功能最丰富,最接近关系型数据库.具有高性能, ...
- Express + Mongoose 极简入门
今天尝试使用express + mongoose,构建了一个简单的Hello world,实现以下功能: 定义mongodb使用的Schema,一个User 访问/输出Hello world 访问/i ...
- 分布式-网络通信-IO-基础(2)
IS 与 OS1. 基本 IO 操作1.1. InputStream 与 OutputStream1.1.1. 输入与输出我们编写的程序除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身 ...