题目描述及链接
题解
由于非单值二叉树的情况远多余单值二叉树的情况,所以主要从对立事件出发,一旦满足非单值二叉树的条件直接返回false。
核心思路:从根节点出发,看每个子树的根节点的值与其两个孩子(若果存在的话)的值是否相等,不相等直接返回false。
利用相等的传递性,若每个子树的根节点都和左右节点相等,则这个二叉树是单值二叉树。
需要注意的是,返回值并不是直接返回最外层,无论是true还是false都会逐层向上返回。
单值二叉树每次返回都必须是true。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isUnivalTree(struct TreeNode* root){
if(root == NULL)
return true;
if(root->left && root->left->val != root->val)
{
return false;
}
if(root->right && root->right->val != root->val)
{
return false;
}
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
总结
链式二叉树很多功能都是通过递归实现的,递归的关键是把问题拆解为子问题的思想,并且注意递归的出口条件。
需要注意递归的返回值都是逐层返回的,这题也不例外。
这种逐层返回的性质可以被利用来计数,比如计算二叉树结点的个数等。