這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!