这是《剑指Offer》的第 28 题:

请实现一个函数,用来判断一个二叉树是不是对称的。如果一个二叉树和它的镜像一样,那么说明这个二叉树 是对称的。

这个题,我首先想到的方法是,我们可以先求这个树的镜像,然后再判断它和它的镜像是否相等。 但是,这样的方法需要一个 O(n) 的辅助空间。而且要求树的镜像,涉及到 malloc 和 free 操作, 有些繁琐。我想,如果我们能知道树中的一个节点的镜像节点的位置,我们就可以直接将两者进行 比较。不幸的是,我尝试了树的三种遍历方式,加上 BFS,都没有找出一个对称树的规律。眼看 1 个小时的时间就要到了,我只好先用第一种方式进行提交。

这是我的提交记录。

后续再看书,书中提出了一个非常聪明的解法。书中指出,如果一个树是对称的,那么它“根左右”遍历 和“根右左”遍历得到的序列是一样的。把“根左右”换成“左根右”或者“左右根”也是一样的。基于这一点, 我们就可以直接去将一个节点和它的镜像节点去比较,从而高效的解决问题。

这是我的提交记录。

心得:

  • 这道题告诉我,我并不是一个很聪明的人,但是我依然可以对问题提出自己的解法,并自己编码实现它。 同时,我还可以通过阅读,学习已经有的聪明的解法,从而内化它,在之后面对同样类型的问题,也可以像 聪明人一样提出聪明的解法
  • 因为要准备公司的可信认证考试,我在做题时强迫自己按照 “clean code” 的标准进行编程。“clean code” 标准中 有一条是要在只在文件内部使用的函数名前加上 “static” 关键字。而且经过我多次提交发现,在函数头前 加 “static” 的代码要比不加的代码运行速度慢上许多。

以上。