如何判断root.Left和root.Right是两棵彼此对称的树呢?必须且只需满足如下三个条件:
root.Left.Val = root.Right.Val, 即上图中的3.
root.Left的左子树和root.Right的右子树彼此对称,即上图中的2, -1.
root.Left的右子树和root.Right的左子树彼此对称,即上图中的4, 9.
root.Left.Val = root.Right.Val, 即上图中的3.
root.Left的左子树和root.Right的右子树彼此对称,即上图中的2, -1.
root.Left的右子树和root.Right的左子树彼此对称,即上图中的4, 9.
显然,这是一个递归问题。在编程阶段,直接使用递归算法即可。而且,跟树相关的很多题目,都需要用递归算法来解决问题,大家应该熟悉这种思路。
编程实现
通过分析拆解,原问题不攻自破。话不多说,直接上Golang的关键代码:
ifroot. Left== nil&& root. Right!= nil{ returnfalse}
ifroot. Left!= nil&& root. Right== nil{ returnfalse}
returncheckTwoSymmetric(root. Left, root. Right) }
funccheckTwoSymmetric(p, q *TreeNode)bool { ifp == nil&& q == nil{ returntrue}
ifp == nil&& q != nil{ returnfalse}
ifp != nil&& q == nil{ returnfalse}
ifp. Val== q. Val{ returncheckTwoSymmetric(p. Left, q. Right) && checkTwoSymmetric(p. Right, q. Left); }
returnfalse; }
我在leetcode上进行自测,测试用例全部通过。类似地,我们可以判断两棵树是否为相同的树,代码更简单,故不再赘述了。
本文题目很简单,但我想说的是,面试是双方不断沟通交流的过程,有些面试者在拿到题目后,就闷头开始写程序,这是不好的。我建议的方式是,在写之前和面试官简要沟通思路,然后再写。
这个沟通很重要,因为有时候你想写的程序思路,并不是最理想的,或者不严格符合题目要求,或者不是面试官所期待的,所以,提前简要沟通思路是有好处的,提前避免在错误路上越走越远。
在实际工作中,你也会发现,很多需求细节是不明确的,因此需要反复沟通和确认,这些都是很正常的,千万不要害怕沟通。
(完)
加入「码农周刊VIP会员」,成为更好的开发者!