这是悦乐书的第366次更新,第394篇原创
java
今天介绍的是LeetCode
算法题中Easy
级别的第228
题(顺位题号是965
)。若是树中的每一个节点具备相同的值,则二叉树是单一的。当且仅当给定树是单一时才返回true
。node
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数据结构
注意:code
给定树中的节点数量将在[1,100]范围内。递归
每一个节点的值将是[0,99]范围内的整数。
class
题目的意思是判断二叉树中的节点值是否都是一个值,为同一个值就返回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); }
针对第一种解法的递归方式,咱们也能够换成迭代的方式,借助栈Stack
来实现。List
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; }
在第二种解法的基础上,咱们能够直接判断出栈的树的节点值是否等于根节点值,省掉存入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; }
既然判断节点值是否都是同一个值,那么能够借助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); }
针对第四种解法,也能够经过迭代的方式的来实现,借助栈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; }
咱们也能够直接用递归,不借助其余的类。
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); }
针对上面的第六种解法,咱们还能够再简化下。由于题目给了二叉树节点的数量范围,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); }
算法专题目前已连续日更超过七个月,算法题文章234+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!