今天我们一起来做一道初级的二叉树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);//左右子树等于根的值,继续下面的左右子树}