一、二叉树的分层遍历

给定一棵二叉树,要求进行分层遍历,每层的节点值单独打印一行,下图给出事例结构:

思路:

增加两个TreeNode:last和nlast

  • last:表示当前遍历层最右结点
  • nlast:表示下一层最右结点

(本质,就是每当某个节点的左右孩子进入队列,该节点被弹出,如果该节点等于last值,默认遍历完该层节点,之后另last=nlast,之后再碰到弹出的值与last值相等,继续上述操作)

从根结点开始,将根结点放入队列①,之后弹出根结点①,每弹出一个结点就先后将其左右结点②③放入队列中,由于队列先进先出,因此先取出的是②,然后将④⑤放入到队列中,然后从队列中取出一个结点,由于队列先进新出,此时取出的是之前放入的③,再将⑤⑥放入队列,再将⑦8放入队列中,此时弹出的是⑤,由于从第二层开始总是从左到右放入队列,下一层的结点一定是在当前层的结点之后才放入并且也是从左到右放入的,因此总体顺序必然是从上到下,从左到右的。

白话描述:last=1,nlast=2,3即其左右孩子,输出左右孩子后,队列中弹出1,1==last,此时last=nlast=3(赋值操作),因为2先进入队列,队列中进入其左孩子,弹出2,再进入3的左右孩子,nlast=5,6,弹出3,此时弹出的3==last,故新last=nlast=6(赋值操作),nlast=7,8,弹出5,又6没有左右孩子,弹出6==last,此时last=nlast=8(赋值操作),7没有孩子节点,弹出7,再弹出8=last=nlast,打印完毕(即last=nlast完全相等时说明打印完毕) 。

二、二叉树的序列化与反序列化

(1)二叉树序列化(持久化)

即:二叉树–》字符串
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。

序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
先序序列化二叉树==定义一个stringbuilder保存序列过程中的结果:按照先序遍历方式遍历二叉树,若结点非空则把 “结点值!” append到builder中;若结点空则把 “#!” append到builder中;最后用builder生成字符串就是序列化结果。

(2)二叉树反序列化

即:字符串–》二叉树
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

三、python代码实现

class bintree(object):def __init__(self,x):self.val=xself.left=Noneself.right=None
class solution(object):
#二叉树的反序列化:
#通过对一个列表的处理,来完成反序列化,即从根节点开始,每完成一个节点的左右孩子处理,即删除该点,同时列表添加该点的左右孩子节点,
#依次类推,直到所有节点被处理完,此时,列表中应当没有节点,因此while条件是列表长度不为0def strtotree(self,strlist):if len(strlist)==0 or strlist==None:return Nonefirst=strlist.pop(0)
#找到根节点root=bintree(first)re_list=[]re_list.append(root)while len(re_list)!=0: left=strlist.pop(0)right=strlist.pop(0)if left!='#!'and right!='#!':binleft=bintree(left)binright=bintree(right) re_list[0].left=binleftre_list[0].right=binrightre_list.append(binleft)re_list.append(binright) re_list.pop(0)elif left=='#!'and right!='#!':binright=bintree(right)re_list[0].right=binrightre_list.append(binright)re_list.pop(0)elif left!='#!'and right=='#!':binleft=bintree(left)re_list[0].left=binleftre_list.append(binleft)re_list.pop(0) else:re_list.pop(0)return root
#二叉树的序列化(思想是有两个列表,把放树的那个列表依次移到新的列表中并删除原来对应的部分,
#其中也转化形式,直到放树的列表中所有参数移完为止,因此列表的循环条件是原来放树的列表长度不为0)def seralize(self,root):temp,ch=[root],[]while len(temp)!=0:m=temp.pop(0)if m==None:ch.append('#!')else:temp.append(m.left)temp.append(m.right)ch.append(m.val+'!')return ch#二叉树的层次遍历打印输出:
#方法一(23ms.5708K):def Print(self, root):# write code herelast,nlast=root,rootqueue,xiangtaoqueue=[root],[]newqueue=[]while len(queue)!=0:m=queue.pop(0)newqueue.append(m.val)if m.left!=None:nlast=m.leftqueue.append(nlast)if m.right!=None:nlast=m.rightqueue.append(nlast)if m==last:last=nlastxiangtaoqueue.append(newqueue)newqueue=[]return xiangtaoqueue
#方法二:(29ms,5604k)def Print(self, root):if not root:return []nodeStack = [root]result = []while nodeStack:res = []nextStack = []for i in nodeStack:res.append(i.val)if i.left:nextStack.append(i.left)if i.right:nextStack.append(i.right)nodeStack = nextStackresult.append(res)return result
s = solution()
root = s.strtotree(strlist =['A!', 'B!', 'C!', '#!', 'D!', '#!', 'E!', 'F!', '#!', '#!', '#!', '#!', '#!'])
s.cengciprint(root)

二叉树序列化、反序列化、层次遍历python相关推荐

  1. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

    二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...

  2. 数据结构(三)打印二叉树中结点层次遍历序列的实现

    1.实验目的: 掌握二叉树的结构特性以及二叉链表的存储结构的特点及适用范围.同时,掌握用指针类型描述.访问和处理二叉树的运算. 2.试验问题: 建立一棵二叉树,按层次遍历该二叉树,并显示出这棵二叉树. ...

  3. leetcode第297——二叉树的序列化与反序列化(层次遍历)

    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 1.需求 请设计一个算法 ...

  4. 69. 二叉树的层次遍历Python实现

    '''69. 二叉树的层次遍历 描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)您在真实的面试中是否遇到过这个题? 样例 给一棵二叉树 {3,9,20,#,#,15,7} :3/ \ ...

  5. 二叉树序列化/反序列化

    二叉树被记录成文件的过程,为二叉树的序列化 通过文件重新建立原来的二叉树的过程,为二叉树的反序列化 设计方案并实现. (已知结点类型为32位整型) 思路:先序遍历实现. 因为要写入文件,我们要把二叉树 ...

  6. 【剑指 offer】(二十三)—— 从上往下打印二叉树(或曰层次遍历、广度优先遍历)

    从广度优先到深度优先,只差一个数据结构. 从上往下打印二叉树,实质是在考察树的遍历问题,显然不同于更为经典的先序.中序和后序遍历,而属于一种层次遍历,或曰广度优先遍历. 二叉树节点的定义如下: str ...

  7. LeetCode: 107_Binary Tree Level Order Traversal II | 二叉树自底向上的层次遍历 | Easy

    本题和上题一样同属于层次遍历,不同的是本题从底层往上遍历,如下: 代码如下: 1 struct TreeNode { 2 int val; 3 TreeNode* left; 4 TreeNode* ...

  8. 二叉树的后序遍历-python

    leetCode第145题 二叉树的后序遍历 链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal 给你一棵二叉树的根 ...

  9. 二叉树的后序遍历Python解法

    给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 . 输入:root = [1,null,2,3] 输出:[3,2,1] 解析: 和前序遍历一样,递归,换个位置即可. # Definiti ...

最新文章

  1. 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)
  2. 基于Springboot实现茶叶商城系统
  3. 大数据笔记2019.5.6
  4. python培训出来的有公司要吗-Python培训班出来好找工作吗?
  5. 网格中的BFS,逆向(POJ2049)
  6. Android -- 再来一发Intent
  7. 【H3C交换机】cpu各个进程的详细说明
  8. vue-resource跨域问题
  9. php for嵌套循环_PHP中的for循环怎样嵌套
  10. php mysql 分行执行,php执行mysql存储及执行脚本
  11. kmeans中的k的含义_硬质合金中P、M、K、N、S、H六大字母含义详解
  12. php tesseract,PHP ocr:用Tesseract OCR进行文字识别
  13. SpringCloudAlibabaSentinel入门教程
  14. 计算机wps文字背景怎么设置,如何在wps文本中添加背景以及如何将图片设置为页面背景...
  15. ORACLE-递归查询(分层查询)
  16. 6.1儿童节,致我们回不去的童年
  17. Windows句柄数限制
  18. win2003配置apache支持php_asp,Win2003下配置asp+cgi+php+mysql
  19. 球差透射电镜和透射电镜的测试能力区别在哪?
  20. 太弱的愿望 = 没有愿望

热门文章

  1. 2022-2027年中国绵羊毛行业市场全景评估及发展战略规划报告
  2. 大白话讲解小波变换由来
  3. .net core优秀开源项目(更新中)
  4. ThinkPHP URL自己带上参数PHPSESSID
  5. java实现hls_Easydarwin加FFMPEG实现HLS流视频点播
  6. 【嵌入式】MX283A开机
  7. Django DTL模板变量使用
  8. 医院网站建设改版:医院站群系统模块有哪些?
  9. 菜鸟者学习C语言编程
  10. mail是什么意思?一次性邮箱注册哪家好你知道吗?