剑指offer2之打印二叉树

前言

打印二叉树,实际上就是考察树的遍历算法,其实就是层序遍历或者说树的广度优先搜索(BFS)。而这个遍历算法的实现就是结合队列来实现。那么下面将会以三种展现形式来打印一颗二叉树。

题目一(不分行从上到下打印二叉树—-牛客网)

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

算法思路

我们可以通过具体的例子模拟输出的过程,那么会发现,它总是拿待输出节点列表的首节点优先输出,而节点总是插入到待输出节点列表尾部,因此很容易知道这是一个”先进先出”的过程,满足队列的特性。因此需要利用队列进行实现。

算法实现

可以使用普通队列 queue 也可以使用双端队列 deque

题目二(把二叉树打印成多行—牛客网)

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

算法思路

遍历依旧和题目一一样,但是需要存储每一层输出的节点到数组中,那么就要先确定当前层需要输出多少个节点。因此,定义一个变量 tobeoutput 表示当前层待输出的节点数。那么该变量就在遍历二叉树的时候自减,然后当变量为零时,表示该层已全部输出完毕,那么就更新该变量下层需要输出的节点数,这个数刚好就是已经在队列中的节点数。

算法实现

题目三(按之字形顺序打印二叉树—牛客网)

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

算法思路

要实现打印之字形的二叉树需要利用一对栈配合操作。自己手动模拟一遍就懂了。不需要分奇数层和偶数层了,因为一个栈输出完毕后,才会输出另一个栈中的元素,因此可以以栈不空为条件判断当前需要从那个栈输出元素就行。

算法实现

复杂度分析

由于遍历的时候对二叉树的每个节点仅遍历一次,因此时间复杂度均为 O(n),空间复杂度主要是由节点值的存储数组所消耗。

注:对根节点 root 需要判空,否则在牛客网上会出现段错误,提示您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起,一定需要处理特殊值的输入,随时注意空指针的情况。

参考

<<剑指offer2>>

-------------本文结束感谢您的阅读-------------