题目
题目来源:力扣(LeetCode)
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例 1:
输入:[1,1,1,1,1,null,1]
输出:true
示例 2:
输入:[2,2,2,5,2]
输出:false
思路分析
方法一:深度优先搜索
对二叉树进行一次深度优先搜索,在这过程中,将节点值加入 Set 集合中,在遍历完后二叉树后,判断 Set 集合的大小。
JS 中的 Set 集合中的元素的值都是唯一的,没有重复的值,因此,如果Set 集合中的元素个数大于1,说明二叉树每个节点上的值都不是相同,这棵二叉树不是单值二叉树。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*//*** @param {TreeNode} root* @return {boolean}*/var isUnivalTree = function(root) {const set = new Set()dfs(root)// 如果set集合的大小大于 1,说明不是一棵单值二叉树return set.size > 1 ? false : true// 遍历二叉树,将树中的节点加入 set 集合中function dfs(root){if (root != null) {set.add(root.val)dfs(root.left)dfs(root.right)}}};
方法二:递归
如果一颗树是单值的,那么根节点的子节点所在的子树也是单值的,同时根节点的值与子节点的值相同。
- 我们把根节点的值当做一个基准,如果和根节点的值不同,那么就不是单值二叉树,否则是单值二叉树。
- 遍历一次二叉树,每次和根节点的值比较即可。
- 创建一个递归函数,判断每个数的节点是否与给定值相等。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*//*** @param {TreeNode} root* @return {boolean}*/const isUnivalTree = root => {// 定义一个递归函数,判断当前节点是否和给定值相等const check = (node, val) => {// 递归出口:节点空,返回trueif (!node) return true;// 当前节点值与根节点值不相等,返回falseif (node.val !== val) return false;// 返回上一级的内容:左子树和右子树是否都相等return check(node.left, val) && check(node.right, val);};// 将根节点放入函数,根节点的值作为给定值return check(root, root.val);};
