文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 解法一
- 思路和算法
- 代码
- 复杂度分析
- 解法二
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:单值二叉树
出处:965. 单值二叉树
难度
3 级
题目描述
要求
如果二叉树每个结点都具有相同的值,那么该二叉树是单值二叉树。
给定二叉树的根结点 root \texttt{root} root,如果给定的树是单值二叉树,返回 true \texttt{true} true,否则返回 false \texttt{false} false。
示例
示例 1:
输入:
root
=
[1,1,1,1,1,null,1]
\texttt{root = [1,1,1,1,1,null,1]}
root = [1,1,1,1,1,null,1]
输出:
true
\texttt{true}
true
示例 2:
输入:
root
=
[2,2,2,5,2]
\texttt{root = [2,2,2,5,2]}
root = [2,2,2,5,2]
输出:
false
\texttt{false}
false
数据范围
- 树中结点数目在范围 [1, 100] \texttt{[1, 100]} [1, 100] 内
- 0 ≤ Node.val < 100 \texttt{0} \le \texttt{Node.val} < \texttt{100} 0≤Node.val<100
解法一
思路和算法
根据单值二叉树的定义可知,只要所有结点值都和根结点值相同,则是单值二叉树,只要有一个结点值和根结点值不同,则不是单值二叉树。因此可以遍历二叉树并判断每个结点值是否和根结点值相同。
深度优先搜索的做法是,首先判断根结点的左子结点和右子结点是否存在,如果子结点存在则遍历相应的子树,对于每个访问的结点,判断结点值是否和根结点值相同。
由于二叉树的结构具有递归性,因此可以使用递归实现深度优先搜索,从根结点开始递归搜索。
递归的终止条件是当前结点的左右子结点都为空,即当前结点是叶结点,此时以当前结点为根结点的子树是单值二叉树。
对于其余情况,首先对当前结点的左右子结点进行判断,然后执行递归。
-
如果当前结点的左子结点存在但是左子结点值和当前结点值不同,或者当前结点的右子结点存在但是右子结点值和当前结点值不同,则以当前结点为根结点的子树不是单值二叉树,原始二叉树也不是单值二叉树。
-
如果当前结点的左右子结点符合单值二叉树的要求,即子结点不存在或子结点存在且子结点值和当前结点值相同,则对子树执行递归。
-
如果当前结点的左子结点存在,则对左子树执行递归,判断左子树中的每个结点值是否等于左子结点值。
-
如果当前结点的右子结点存在,则对右子树执行递归,判断右子树中的每个结点值是否等于右子结点值。
-
代码
class Solution {
public boolean isUnivalTree(TreeNode root) {
if (root.left == null && root.right == null) {
return true;
}
if (root.left != null && root.left.val != root.val) {
return false;
}
if (root.right != null && root.right.val != root.val) {
return false;
}
return (root.left == null || isUnivalTree(root.left)) && (root.right == null || isUnivalTree(root.right));
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。
-
空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)。
解法二
思路和算法
也可以使用广度优先搜索遍历二叉树,判断每个结点值是否和根结点值相同。
广度优先搜索需要使用队列存储结点。初始时将根结点入队列,遍历过程中,每次将一个结点出队列,执行如下操作。
-
如果当前结点值和根结点值不同,则二叉树不是单值二叉树。
-
如果当前结点值和根结点值相同,则得到当前结点的左右子结点,并将非空子结点入队列。
当队列为空时,遍历结束,如果所有结点值都和根结点值相同,则是单值二叉树。
代码
class Solution {
public boolean isUnivalTree(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.val != root.val) {
return false;
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
return true;
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。
-
空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n。