目录
一:题目
二:思路
三:代码
四:递归展开图
一:题目
解释:单值二叉树就是指的节点值全相等的二叉树,所以即使是空树也是单值二叉树
二:思路
单值二叉树的递归“大事化小”思路就是:
既然单值二叉树树的每个节点值相等,则我们只需要递归检查每个节点和它的左右孩子值是否相等即可!所以判断当前节点和它的左右孩子值是否相等,这是“大事”中的第一步小事,但这一步做完后问题并没有结束,因为左右子树内部还有大量节点没被检查,所以必须把“左子树是否单值”和“右子树是否单值”当作两个新的“大事”继续递归拆解
递归条件和终止条件:
终止条件:
①:发现当前检查的节点为空 return true(NULL代表不存在 所以没有值不相等这一说 相等)
②:不满足①也就是不为空,若当前节点值和左孩子值或右孩子值不等,return false
递归条件:
当前节点不为空,且和左右孩子值相等,则对左右孩子进行递归检查
三:代码
/** * 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 == 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); } };解释:
①:先写终止条件①,当前节点是空则true,反之不是空才能进行对当前节点的左右孩子的访问
②:现在写终止条件②即可,当然判断左右孩子值时,需要判断左右孩子是否存在
③:经过上述代码,来到这里就代表当前节点和它的左右节点的值相等,则递归遍历左右孩子进行同样的操作
④:终止条件②只要一个不满足,就代表二叉树不是单值二叉树,最后的递归代码必须用&&,因为两个孩子的递归判断都必须通过
四:递归展开图
注:红色线是递,蓝色线是归
本博客采用此模型:
总:
左:
右:
不太清晰,再对半发:
左上:
左下:
右上:
右下:
📌 [ 作者 ] shylyly
📃 [ 首次发布 ] 2024.8.26
❌ [ 最新修改 ] 2026.8.4
📜 [ 声明 ] 由于笔者水平有限,文中难免有疏漏或不妥之处,还望读者不吝赐教