题目
题目来源:力扣(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) => {
// 递归出口:节点空,返回true
if (!node) return true;
// 当前节点值与根节点值不相等,返回false
if (node.val !== val) return false;
// 返回上一级的内容:左子树和右子树是否都相等
return check(node.left, val) && check(node.right, val);
};
// 将根节点放入函数,根节点的值作为给定值
return check(root, root.val);
};