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.特数二 ...
随机推荐
- 29.Jwt集成(3):token设置过期时间、异常判断
token设置过期时间 package main import ( "fmt" "github.com/dgrijalva/jwt-go" "io/i ...
- constant read 和 current read
来自网络,并且在本机实验完成: onsistent read :我的理解,就是通过scn来读取. 读取的过程中要保证 scn是一致的.举个例子,一个SELECT 语句在SCN=100的时刻开始读取一 ...
- POJ1185炮兵阵地(DP状态压缩)
问题描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P&quo ...
- web性能优化-浏览器工作原理
要彻底了解web性能优化的问题,得搞清楚浏览器的工作原理. 我们需要了解,你在浏览器地址栏中输入url到页面展示的短短几秒中,浏览器究竟做了什么,才能了解到为什么我们口中所说的优化方案能够起到优化作用 ...
- Spring mvc i18n国际化的简单demo
在渲染视图的xml文件中,配置一个i18nBean 实现两个接口: SessionLocaleResolver --> 加载资源主题 ReloadableResourceBundleMessag ...
- php核心:代际划分/运行环境等
不想在python一棵树上吊死,不是所有Python就一定得会人工智能大数据,so...... 何谓php?早期:personel homepage 是也!后期Hypertext preprocess ...
- Python 面向对象Ⅴ
基础重载方法 下表列出了一些通用的功能,你可以在自己的类重写: 运算符重载 Python同样支持运算符重载,实例如下: 以上代码执行结果如下所示: 类属性与方法 类的私有属性 __private_at ...
- Python 模块 Ⅱ
搜索路径 当你导入一个模块,Python 解析器对模块位置的搜索顺序是: 1.当前目录 2.如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录. 3.如果都 ...
- C# 使用vs2013 写 windows服务
第一步:添加windows服务项目 并起一个 好看的名字 第二步:添加安装程序 第三步:右键点击serviceProcessInstaller1属性,在Account中选择LocalSystem 第四 ...
- hdu 1081 dp问题:最大子矩阵和
题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ...