难度:简单
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回true;否则返回 false。
示例 1:
输入:[1,1,1,1,1,null,1]输出:true
示例 2:
输入:[2,2,2,5,2]输出:false
提示:
给定树的节点数范围是[1, 100]。
每个节点的值都是整数,范围为[0, 99]。
通过阅读题目,我们能发现,只要所有节点的值 都一样,就返回true,否则返回 false。
最开始的想法是,找一个变量 记录根节点的值,然后 用深搜去搜索,只要发现有那么一个不一样,就返回 false。
但是这又出现了问题,我无法保证 这个变量 不会被其他子节点的值代替。
转念一想,根据二叉树的性质,能够直接比较的 只有三个值:根节点的值,左孩子的值,右孩子的值。既然要比较 是否有不一样的,那我也可以深搜遍历,在这三个值里面去对比,然后得出结果。
于是 写出判断条件,如果左孩子存在,那左孩子的值与根节点的值 不同,则返回 false。同理,右孩子存在时,右孩子的值 与 根节点的值 不同,返回 false。
if(root->left != nullptr && root->left->val != root->val){
return false;
}
if(root->right != nullptr && root->right->val != root->val){
return false;
}
再设个边界条件,根据样例可以看出,当根节点为 空 时,返回 true。
if(root == nullptr){
return true;
}
最后呢,因为二叉树层层返回值,我们需要 两边返回的 都是 true 才向上返回 true,只要有一边为 false,就返回 false。而这个时候 《与》 正好满足我们的需求,两边为 true 则为 true,其他都是 false。
所以最后 返回值 return isUnivalTree(root->right) && isUnivalTree(root->left);
最后代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isUnivalTree(TreeNode* root) {
if(root == nullptr){
return true;
}
if(root->left != nullptr && root->left->val != root->val){
return false;
}
if(root->right != nullptr && root->right->val != root->val){
return false;
}
return isUnivalTree(root->right) && isUnivalTree(root->left);
}
};