周六,被外面的施工给吵醒了,以往没这种情况啊,不知道他们在干啥。今天,我们来聊一下对称树的判断。
这些年来,我不断地忽悠朋友们去BATH, 促进人才流动,自己也能顺便获取一些好处。
S哥便是我忽悠的目标之一,S哥是某985土木工程专业出身,后来转行做了程序员,去T公司面试,碰到这样一道题目(一看就是leetcode中的easy级别问题):
我们来分析一下这个问题,如下图所示,假定root的左子树和右子树都存在,那么root树对称的充分必要条件是:root.Left和root.Right是两棵彼此对称的树。
如何判断root.Left和root.Right是两棵彼此对称的树呢?必须且只需满足如下三个条件:
a. root.Left.Val = root.Right.Val, 即上图中的3.
b. root.Left的左子树和root.Right的右子树彼此对称,即上图中的2, -1.
c. root.Left的右子树和root.Right的左子树彼此对称,即上图中的4, 9.
显然,这是一个递归问题。
通过分析拆解,原问题不攻自破。话不多说,直接上代码:
func isSymmetric(root *TreeNode) bool {
if root == nil {
return true
}
if root.Left == nil && root.Right != nil {
return false
}
if root.Left != nil && root.Right == nil {
return false
}
return checkTwoSymmetric(root.Left, root.Right)
}
func checkTwoSymmetric(p, q *TreeNode) bool {
if p == nil && q == nil {
return true
}
if p == nil && q != nil {
return false
}
if p != nil && q == nil {
return false
}
if p.Val == q.Val {
return checkTwoSymmetric(p.Left, q.Right) && checkTwoSymmetric(p.Right, q.Left);
}
return false;
}
在leetcode上进行了自测,通过。类似地,我们也可以判断两棵树是否为相同的树,代码就更简单了,故不赘述。
遇到问题,要学会分解,然后各个击破。最后说一下,S哥心比天高,有理想有追求,祝贺S哥拿到T公司的offer,我相信,这不是终点。