二叉树OJ题讲解之一

今天我们一起来做一道初级的二叉树OJ题,都是用递归思想解答

力扣965.单值二叉树       链接https://leetcode.cn/problems/univalued-binary-tree/description/

 所谓单值二叉树就是这棵二叉树的所有节点的值是相同的,那我们要做这道题,肯定要把这棵树的所有结点遍历一遍,看看所有结点的值是否相等。那怎么遍历呢?二叉树有前序遍历、中序遍历、后序遍历和层次遍历,对于这道题而言,要看所有结点的值是否相等,无疑前序遍历是最方便的,因为我们只有先检查了根节点的值是一直才能继续遍历左右子树。所以,我们开始解答这道题

我们想,如果这棵树是一棵空树,该怎么处理? 我们认为如果是一棵空树就返回true;

if(root==NULL)
    {
        return true;
    }

接下来走到这里肯定就不为空树,但是左右子树还是有可能一边是空的,那我们分开处理。如果左子树不为空,在这个前提下要是左子树的值等于根节点的值我们返回true,但是我们这样写还是到后面会麻烦,因为只要左子树的值等于根节点的值就true的话,那左子树的左子树呢?后面就不会判断到,所以我们这里还是以不相等的条件进行处理,即

if(root->left!=NULL&&root->left->val!=root->val)
    {
        return false;
    }

同理右子树不为空我们可以写成

if(root->right!=NULL&&root->right->val!=root->val)
    {
        return false;
    }

空树、左右子树都不为空的情况我们都判断了,那走到这里,就是根节点的左右子树都等于根节点的值,那我们就继续以根节点的左子树为根,根节点的右子树为根判断了,并且这两个必须同时满足那才能返回true,即

return isUnivalTree(root->left)&&isUnivalTree(root->right);

我们运行提交,就通过啦

完整代码

bool isUnivalTree(struct TreeNode* root) {
    if(root==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 isUnivalTree(root->left)&&isUnivalTree(root->right);//左右子树等于根的值,继续下面的左右子树
    
}

猜你喜欢

转载自blog.csdn.net/weixin_67131528/article/details/134662346