100. 相同的树
关于树的递归问题,永远考虑两方面:返回条件和子问题
- 先考虑返回条件,如果当前的根节点不相同,那就返回false(注意,不要判断相等时返回什么,因为当前相等并不能说明后面节点相等,所以要转换为不相等返回什么)
- 但是还要考虑为空的情况,如果两个树的根节点都为空,则返回true(只有经过层层比较,当比较到最后都为空树时,才返回true);如果一个为空一个不为空,则返回false
- 最后考虑子问题,当前树的根节点比较完毕,那就转化为左子树和右子树进行递归比较
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p == NULL && q == NULL)
{
return true;
}
if (p == NULL || q == NULL)
{
return false;
}
if (p->val != q->val)
{
return false;
}
return isSameTree(p->left, q->left)
&& isSameTree(p->right, q->right);
}
965. 单值二叉树
思路:判断单值的条件,就是让父节点的值与两个孩子的值相等
具体方法:
- 如果为空树,则返回true(必然走到末尾,那前面的值判断都通过)
- 当前节点与左孩子的值进行比较,如果不相等,则返回false(注意,加上条件判断,保证左孩子不为空,防止对空指针的解引用)
- 同理,当前节点与右孩子的值进行比较,如果不相等,则返回false
- 最后的子问题,则返回左子树与右子树的返回值的逻辑与,只要不满足上述条件,就一直往下递归
bool isUnivalTree(struct TreeNode* root)
{
if (root == NULL)
{
return true;
}
if (root->left && root->val != root->left->val)
{
return false;
}
if (root->right && root->val != root->right->val)
{
return false;
}
return isUnivalTree(root->left)
&& isUnivalTree(root->right);
}