今天这道题还是比较简单的,但是我自己在纸上写的代码还是没有能够一次性通过,对递归的使用还是不够熟练。
题目
Given two binary trees, write a function to check if they are equal or not.
Two binary trees are considered equal if they are structurally identical and the nodes have the same value.

分析
既然要判断两棵树是不是完全相同,题目里已经说明了,不光节点的值要相同,而且形态也要一样,就是说节点的左右子树也要保持一样的深度。
我一开始想的是能不能使用在第一个练习里面实现过的maxDepth来判断左右子树的最大深度是否一致,进而能够将形态的判断完成然后再去看value的值是否一样。但这样一来,就需要两个递归函数了,应该还有比这个更简单的解法。
反过来想想isSameTree已经打算是一个递归函数了,那么能不能把这两个功能整合进一个里面去呢,答案显然是肯定的了。我们在isSameTree(BinaryTree *T1, BinaryTree *T2)里面就能够完成所有的判断,这个函数做这么几件事情:
- 判断T1和T2是否全部为空,如果为空说明是两个空节点,那么它们是相等的,返回true
- 如果T1或者T2其中有一个为空,另外一个不为空,那么他们就是不等的,直接返回false
- 走到这里,说明对节点本身最基本的形态已经判断完成了,那么就可以看看value是否一致了,如果T1和T2的value一致,就可以递归去判断这两个节点的子树了,否则的话直接返回false
是不是很简单呢,这些问题都是上学的时候学习过的,但时间久了就忘记了,这道题目主要卡在对于递归出口条件的定位和使用,所以一开始能想到用递归左右子树,但是不知道怎么写出口条件。对递归的理解还是不够深入。
最后Accept的代码如下:
|
|
这里面还犯了一个毛病就是一开始写成这样了
return isSameTree(p->left, q->left) == isSameTree(p->right, q->right) == true;
真是太大意了。