leetcode 100.相同的树

涉及到递归,最好多画图理解,希望对你们有帮助


100.相同的树

题目

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文字 和 画图 分析

  1. 思考递归进行的条件和结束的条件是什么
  2. 列举递归可能会出现的情况

针对上面两个问题进行解答:

要想找两个树的结构相同有点麻烦,换个思路,我们找它们不同

所以我们需要先对比两者的根节点,再去对比左子树和右子树

[很明显,我们采取的是 前序 遍历整个节点]

  • 在递归的时候,每一次根节点都发生变化,只要根节点对应的数值不同, 就返回 false 结束递归 (其中一种结束条件)

leetcode 100.相同的树_第1张图片

  • 根节点相同,我们无法判断是否两个树结构相同,只能继续递归(这是递归条件)

  • 递归期间,我们还可能碰到以下情况:

leetcode 100.相同的树_第2张图片

如上图:我们遇到空树了

这里还需要分两种情况讨论:

如果两个树在这个节点都是空,则返回 true (这是其中一种结束条件)

[注意:我们是先对比根,再对比左子树,最后对比右子树,所以只有左子树和右子树都为 true 才是一样的树]

如果两个树只有一个为空,则返回 false (这是其中一种结束条件)

  3. 判断的顺序问题

由于可能会遇到空树,先比较根的大小明显是不行的,所以应该把比较是否是空树的条件放前面


代码

bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    if ((p == NULL && q != NULL) || (p != NULL && q == NULL))
	{
		return false;
	}
	if (p == NULL && q == NULL)
	{
		return true;
	}
	if (p->val != q->val)
	{
		return false;
	}
	return isSameTree(p->left, q->left)  && 
	isSameTree(p->right, q->right);
}

你可能感兴趣的:(leetcode,数据结构)