未分类

前端算法之二叉树打印

二叉树打印

按层遍历的方式对二叉树进行序列化
1.用队列来进行二叉树的按层遍历,及宽度优先遍历
2.除了访问节点的顺序是按层遍历之外,对结果字符串的处理,与之前的处理方式一样

二叉树按层遍历

1.针对二叉树的宽度优先遍历
2.宽度优先遍历常使用队列结构

eg:给定一棵二叉树的头结点head,按如下格式打印


要求打印成:
1

23

456

78

思路:使用两个变量 last和nlast记录,和一个队列queue
last表示正在打印的当前行的最右节点
nlast表示下一行的最右节点
令nlast为每行新元素,就能保证nlast指向当前行最右元素

个人理解:开始时,last指向头节点,头节点加入queue,弹出,然后开始遍历子节点,并弹出,子节点遍历完,检验last是否和爹一样,若不一样则继续遍历下一个爹的子节点,直到找到和last指向相同的爹,此时,last指向该爹的小儿子(最后找到的子节点),这时,上一轮的儿子,变为下一轮遍历的爹,继续遍历,直到全部打印完

二叉树的序列化和反序列化
1.二叉树->字符串(序列化)
2.字符串->二叉树(反序列化)

序列化方式
1.根据先序遍历序列化
2.根据中序遍历序列化
3.根据后序遍历序列化
4.按层序列化

思路:(先序为例)
1.假设序列化结果为str,初始时str为空字符串
2.先序遍历二叉树时如果遇到空节点,在str末尾加上”#!”
3.如果遇到不为空的节点,假设节点值为3,就在str末尾加上”3!”
ps:如果不用特殊符号表示值的结束,则这两棵树的序列化结果为:123### 会产生歧义

反序列化:与序列化相反
ps:
1.选择什么样的遍历方式序列化,就用什么方式反序列化
2.一棵树序列化结果是唯一的,唯一的结果生成的二叉树也是唯一的