给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true
思路
一、
何为相同? 必须从头到尾完完整整的相同,才算相同。
可通过前序遍历法,遍历整个树。
可通过以下思路:
//空节点
//至少有一个不为空
//全不为空
二、
子问题:除了判断根节点,还需判断子树是否相同
结束条件:不同return false。 当完全相同时,根节点最终会走到空树,此时才能保证子树相同,返回true (也是唯一 一个可以返回true的条件)。
代码
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); //右树
}
代码解读
1.
//空节点也需要判断
if (p == NULL && q == NULL)
return true;
树不能轻易assert判空,因为空节点也需要比较,也是树的一部分。
2.
if (p == NULL || q == NULL)
return false;
由于第一个return的存在,能执行到此处时,必然一个不为空!
3.
if (p->val != q->val) //节点
return false;
不能判断 == 就return true; 正如开头所说,必须全部相等才能return true;
4.
return isSameTree(p->left, q->left) //左树
&& isSameTree(p->right, q->right); //右树
当所有递归都完成之后,每一层的结果都是true,才能最终返回true。
由于返回类型是bool类型,因此要用 && 逻辑与 连接两个递归结果。