二叉树 —— 按层遍历

news/2024/6/3 5:29:46 标签: 数据结构与算法

二叉树的遍历

二叉树的遍历分先序、中序、后序和层次遍历。实现方式分递归和非递归方式。

这里说说层次遍历。

层次遍历是逐层访问二叉树的每个节点。属于广度优先。常常使用队列的方式。

如图有以下一棵二叉树,它构建的队列形式为:

  

 

 

1、先把根节点 1 放入队列,然后弹出,看看它有没有左右孩子,如果有,按顺序将左右孩子放入队列

 

接着按顺序弹出  2 ,看  2  是否还孩子,如果有将2 的孩子加入队列。

接着弹出 3 看其是否有孩子,如果有依次加入

然后弹出4,看4 是否孩子节点,接着弹出5,看5 是否有孩子节点,如果有 就依次加入队列,显然本例中4 、 5 都没有孩子节点

然后继续弹出6 ,6有孩子节点,依次加入队列,

然后依次弹出7,8这样就对整个二叉树完成了遍历

 

 下面这道题就是根据上图这个方式完成的。

有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列

本题的关键是 指定两个变量 last 和 nlast 来对节点进行跟踪。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class TreePrinter:
    def printTree(self, root):
        # write code here
        if root == None:
            return []
        queue = []     #定义一个队列,盛放节点
        result = []    #定义一个列表,盛放最终结果
        temp = []      #定义一个列表,盛放改行所有节点的值。
        last = nlast = root  #关键:定义两个变量 last nlast  其中:last 永远指向本行最右节点。
                                     #nlast 永远指向 下一行的最右节点 queue.append(root) #首先将root节点 加入队列
while queue: node = queue.pop(0) #弹出队列的第一个节点 temp.append(node.val) #将弹出节点的值,放入temp 列表。 if node.left: queue.append(node.left) #如果弹出节点有左子树,那么将左孩子节点加入队列 nlast = node.left #因为nlast总是执行下一行的最右节点。所以要更新nlast指向。 if node.right: queue.append(node.right) #如果弹出节点有右子树,那么将右孩子加入队列 nlast = node.right # 同时再次更新nlast的指向。 if last == node: #如果弹出节点 == last 指向的节点(last总是指向本行最右节点) 说明一行结束了 last = nlast # 当前行已经结束了,所以更新last使其指向 下一行 的最右节点。 result.append(temp) #将上一行的所有节点的值的结果列表放入最终结果中。 temp = [] # 将temp置空,准备盛放下一行的所有节点的值 return result #返回最终结果
                                                             

转载于:https://www.cnblogs.com/jijizhazha/p/6118054.html


http://www.niftyadmin.cn/n/1093801.html

相关文章

scrapy介绍与实践

掌握 Python 中的网页抓取:从头开始抓取 常用命令 参考: https://www.osgeo.cn/scrapy/topics/commands.html http://www.scrapyd.cn/doc/181.html scrapy startproject(创建项目)scrapy crawl XX(运行XX蜘蛛&…

火狐谷歌浏览器Json查看插件

1.搜: Firefox的JSON插件 参考: Chrome/FireFox浏览器下处理JSON的插件_Bruce_新浪博客 JSONView :: Firefox 附加组件 但是后来去发现没用: 打开一个url,返回的是json数据: 但是却没有自动显示出高亮后的,…

redis安装和使用

rediskvcachepersistence redis是什么 redis remote dictionary server 开源免费 、C语言 、遵守BSD协议的高性能 key/value分布式内存数据库,基于内存运行,支持持久化。 特性 远程:分为客户端,服务端。可以分别部署在不同的…

scrapy多个爬虫同时运行

运行爬虫 import datetime as dt #同时爬取 from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings file_name_A"爬虫A"dt.datetime.now().strftime(%Y-%m-%d) ".json" file_name_B"爬虫B"dt.dat…

poj1830:开关问题

链接:http://poj.org/problem?id1830 某天“佐理慧学姐”突然来问了我这道题。 诶,窝只会线性基,但是好像搞不了方案数啊…… 啃题解吧。 woc!线性代数哦,就是那种我不会的东西么。 矩阵的秩是啥啊……自由元又是啥啊…

常用的第三方库,感觉挺实用的,学习学习在做项目的时候可以达到事半功倍的效果,有兴趣的可以收藏一下,赠人收留余香。...

安全加密:https://github.com/liufan321/NSString-Hash 上拉/下拉刷新:https://github.com/itheima-developer/HMRefresh 照片选择:https://github.com/itheima-developer/HMImagePicker 交互式图像浏览:https://github.com/itheima-developer/HMPhotoBrowser 二维码…

selinum介绍与实践

介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 。 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果&#xff…

闲来写下感慨

自动化 webdriver 一些摘要 firefox public WebDriver driver; public void startFirefox(){ driver new FirefoxDriver(); }// 先声明后定义 初始化启动火狐浏览器// 下面最大化 关闭窗口 public void maxBrowse(){ driver.manage().window().m…