1.问题描述
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true
;否则返回 false
。
二、问题分析
解法1:
递归遍历二叉树,如果二叉树的左右子树均为NULL则返回true;如果二叉树的左右子树中有一个是NULL同时非空的子树的值和其父节点的值相等,则递归判断非空子树的左右子树是否为NULL,否则返回false;如果二叉树的左右子树都不为NULL,则判断左右子树的值和其父节点的值是否都相等,如果都相等则递归判断左右子树的子树是否为NULL,否则返回false;
解法2:
一棵二叉树是否为单值二叉树的条件是它的左右子树均是单值二叉树;左右子树是单值的二叉树的条件是左右子树为NULL或者左右子树的值都等于父节点的值且左右子树的左右子树的也为单值二叉树。
三、代码描述
解法1:
bool isUnivalTree(struct TreeNode* root){
//如果一棵树的左右子树都为空,返回真
if(root == NULL || (root->right == NULL && root->left == NULL))
return true;
else if(root->right == NULL || root->left == NULL)
{
//如果有一个为空,当非空节点的值等于跟节点的值时返回真,并继续遍历其子节点
struct TreeNode* nonNullNode = root->left;
if(root->right != NULL)
{
nonNullNode = root->right;
}
//如果非空节点的值等于其父亲节点的值,则返回其左右子树的判断结果
if(nonNullNode->val == root->val)
{
return isUnivalTree(root->right) && isUnivalTree(root->left);
}
else
{
return false;
}
}
//如果一棵树的左右子树的节点都不为空,判断左右子节点是否等于父节点
else
{
if(root->val == root->left->val && root->val == root->right->val)
{
return isUnivalTree(root->right) && isUnivalTree(root->left);
}
else
{
return false;
}
}
}
解法2:
bool isUnivalTree(struct TreeNode* root){
bool left = (root->left == NULL || (root->left->val == root->val && isUnivalTree(root->left)));
bool right = (root->right == NULL || (root->right->val == root->val && isUnivalTree(root->right)));
return right && left;
}