题目大意:给你一个二叉树,然后要你按层输出这棵树,同层的节点按从左到右的顺序。

仔细描述在这里还有这里

这里写下我做这两道题的思路和想法,由于很久没碰算法题了,所以下面的思路还是可以借鉴借鉴的(从最容易慢慢扩展而来)。

第一种方法:

我们可以把二叉树的每个节点进行标号,根节点的序号为1,每个节点i的左儿子节点为2i,右儿子为2i+1.这样的话我们可以先对这棵树进行一次遍历,也就是对每个顶点进行标号。当然我们用一个map来存每个节点的实际值和我们所标记的值,而且map会自动帮我们进行排序,树的遍历完成之后,我们对map进行一次遍历,根据编号计算出所在的层数,然后按顺序添加即可。每个节点所在的层数为log2(i)(其中i是编号)。

第二种方法:

其实对于上面的方法,我们再仔细想想,发现map是可以不用的,也就是在对树进行遍历的时候,就可以确定每个点所在的层数(由编号所得),而且我们可以确保每一层的节点都是按照从左到右的顺序添加的(树的遍历确保了这一点,先访问左子树,后访问右子树)。这样的话我们可以省略掉map结构,直接得到结果。

上面两种方法的代码在这里

第三种方法:

上面两种方法其实已经不错了,按理说时间复杂度,空间复杂度什么的也不大,不过有一个问题,那就是我们的编号,我们每次都是乘2处理的,这样的话,如果树的高度很高的话,那么这个编号是存不下来的,这里就出现问题了。其实解决这个问题也很容易,就是把乘2换成+1就行了,而且这样还省略了间接求每个点所在层数的花销。这样就得到了第三种方法。

第三种算法的代码在这里

对于算法熟的人,可能第一眼就能想到第三种方法了,不过如果能够一步一步的想到第三种算法,那也是不错的哦。

Comments