二叉树的遍历是指按照某种顺序依次访问树中的所有节点一次。

四种遍历方式分别是:先序遍历、中序遍历、后序遍历、层序遍历。其中前三种属于深度优先遍历(DFS),后一种属于广度优先遍历(BFS)。

首先声明节点类

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself,right = None

二叉树的先序遍历

若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。

递归实现:

def preOrder(self, root):if not root:return # 先访问根节点print(root.val)# 递归访问左子树preorder(root.left)# 访问右子树preorder(root.right)

迭代实现:

def pre(self, root):# 将 root放入栈顶stack = [root]while stack:# 取栈顶元素s = stack.pop()if s:print(s.val)# 由于栈的先进后出特性 先放入右孩子 再放入左孩子stack.append(s.right)stack.append(s.left)

二叉树的中序遍历

若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。

递归实现:

def midOrder(self, root):if not root:return# 先访问左节点 再访问根节点 最后访问右节点midOrder(root.left)print(roo.val)midOrder(root.right)

迭代实现:

# 对于树的遍历 ,基本会用到栈这个数据结构
def inOrder(self,root):stack = []while stack or root:# 当root节点存在,一直往下遍历 直到遍历到叶节点while root:stack.append(root)root = root.left# 当前节点为None时 出栈一个节点打印出节点的value值root = satck.pop()print(root.val)# 也系欸但的孩子肯定为空 所以就会弹出栈中叶节点的父节点,当左子树完全遍历完就会遍历右子树root = root.right

二叉树的后序遍历

若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。

递归实现:

def postOrder(self, root):if not root:return postOrder(root.left)postOrder(root.right)print(root.val)

迭代实现:

法一:

def post(self, root):stack = []while root or stack:# 下行遍历 一直遍历到叶节点while root:# 将根节点放入放入栈中stack.append(root)# 能左就左 能右就右if root.left:root = root.leftif root.right:root = root.rights = stack.pop()print(s.val)# 如果当前节点是上一节点的左子节点,则遍历右子节点if stack and s == stack[-1].left: root = stack[-1].rightelse:root = None

法二:在先序遍历的基础上稍加改动

# 先序遍历 顺序是 根左右 ,后续遍历是 左右根
# 所以可以将res数组的值反过来输出
def post_2(self, root):stack = [root]res = []while stack:s = stack.pop()res.append(s.val)stack.append(s.left)satck.append(s.right)return res[::-1]

二叉树的层次遍历

从上往下、从左至右依次打印树的节点

写法一:利用队列

def levelOrder(self, root):# 如果根节点不存在,返回空列表if not root:return []# 结果列表res = []# 将根节点放入队列queue = [root]while queue:# 获取当前队列的长度 也就是这一层的节点数size = len(queue)tmp = []# 将队列中的元素拿出来 放到临时list中# 如果左右子树不为空,放入队列中for _ in range(size):# 弹出队列中的节点r = queue.pop(0)# 将r的值 存进临时列表中tmp.append(r.val)if r.left:queue.append(r.left)if r.right:queue.append(r.right)res.append(tmp)return res

写法二:利用collections.deque 双向队列

def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""# 创建队列queue = collections.deque()queue.append(root)# 结果集res = []while queue:size = len(queue)level = []for _ in range(size):# 弹出左边第一个元素cur = queue.popleft()if not cur:continuelevel.append(cur.val)queue.append(cur.left)queue.append(cur.right)if level:res.append(level)return res

二叉树的一些基本操作总结:

1.二叉树的最大深度

def maxDepth(self, root):if not root:return 0return max(maxDepth(root.left), maxDepth(root.right)) + 1

2.二叉树的最小深度

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。可以通过递归求左右节点的最小深度的较小值,也可以层序遍历找到第一个叶子节点所在的层数。

递归实现:

def minDepth(self, root):if not root:return 0    if not root.left and not root.right:return 1 if not root.right:return 1+self.minDepth(root.left)if not root.left:return 1+self.minDepth(root.right)return 1+min(self.minDepth(root.left),self.minDepth(root.right))

迭代实现:

def min_Depth(self, root):if not root:return 0ans , count = [root], 1# 遍历完所有节点while ans:n = len(ans)# 遍历完某一层的节点for _ in range(n):r = ans.pop(0)if r:# 算法遍历每一层 发现某一层的某个节点没有子树 返回countif not r.left and not r.right:return count# 如果左孩子存在 加入栈ans.append(r.left if r.left else [])ans.append(r.right if r.right else [])count+=1 return count

未完待续 ,后续还会补充更多知识点。

参考链接:

https://www.cnblogs.com/anzhengyu/p/11083568.html

https://www.cnblogs.com/bjwu/p/9284534.html

python实现树的遍历相关推荐

  1. python 标签树的遍历

    下行遍历: .contents:字节点列表,将<tag>所有儿子节点存入列表 他的儿子,就是title. body的儿子还有\n,对呀.这个也算是一个节点! (比例不对就用放大镜查看!嘿嘿 ...

  2. python作者 google面试_如果Google面试让你用python写一个树的遍历程序

    前几天忽然对python很感兴趣,学了几天也感觉它非常的简洁实用.打破了我这么长时间对java C# C 和vb的审美疲劳,让我眼前一亮."就像读英文一样简单"这句话评价pytho ...

  3. 树的遍历(python)

    树的遍历Tree Traversals ❖对一个数据集中的所有数据项进行访问的操作称为"遍历Traversal" ❖线性数据结构中,对其所有数据项的访问比较简单直接按照顺序依次进行 ...

  4. LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历--递归,迭代--反向压栈--C++解法

    LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历–递归,迭代–反向压栈–C++解法 LeetCode题解专栏:LeetCode题解 LeetC ...

  5. python数据结构 树_python 数据结构四 之 二叉树和树

    python数据结构教程第四课 树形结构是复杂结构中最简单的一类,这是一类非常重要的结构,在实际中使用广泛,反映了许多计算过程的抽象结构 一.简介 1.树 2.二叉树 二.二叉树和树的抽象数据类型(A ...

  6. 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构(数组.链表.队列.堆栈等)不同,树可以以不同的方式遍历,常见的有中序遍历,前序遍历和后序遍历. 实现各种遍历的方法又包括: 以上图为例: 深度优先遍历:  (a) ...

  7. mysql 遍历_MySQL 实现树的遍历详解及简单实现示例

    MySQL 实现树的遍历 经常在一个表中有父子关系的两个字段,比如empno与manager,这种结构中需要用到树的遍历.在Oracle 中可以使用connect by简单解决问题,但MySQL 5. ...

  8. 那些妖术——树的遍历

    本文参加CSDN博客大赛,如果你喜欢请投一票,非常感谢! 这个方法有点邪门,和大家在课堂上学的有点不一样,所以blog的名字取得有点邪乎. 一般的程序员应聘技术类的笔试都会有一道题目,那就是树的遍历( ...

  9. LeetCode总结 -- 树的遍历篇

    遍历树的数据结构中最常见的操作. 能够说大部分关于树的题目都是环绕遍历进行变体来解决的. 一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历. 那么一般递归的解法就过于简单了. 面试官 ...

最新文章

  1. centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
  2. VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
  3. 关于海量数据查找排序问题
  4. BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA
  5. 成员函数指针与高性能的C++委托
  6. java world_Java World中的GraphQL简介
  7. Linux之Shell管理脚本(一)
  8. 修改linux端口22,修改LINUX 默认的22端口
  9. Python3中如何做的自定义模块的引用?
  10. 华悦网游器软件介绍及功能介绍
  11. 教你itunes电脑版怎么下载
  12. [分享]下载电影文件英文标识的含义
  13. 用python预测超车是否危险_用Python预测泰坦尼克号乘客生存情况
  14. 【FPGA】:ip核---乘法器(multiplier)
  15. ios手机页面滑动卡顿问题
  16. 计算机发展简史 计算机的发展历史介绍
  17. Vue 安装echarts-gl引入vue报错
  18. 使用Python提取txt文件中的数据到excel中
  19. 树莓派4b移植4G USB驱动Quectel EC200T以及ppp拨号
  20. 【Linux】从冯诺依曼体系到初识Linux下的进程

热门文章

  1. 什么是双线机房??双线是怎么实现的!!!
  2. 索尼VAIO笔记本电脑Windows 8改成Windows 7
  3. C语言文件操作-总是打不开文本文档
  4. Artificial Intelligence for the Metaverse: A Survey
  5. 511遇见易语言API模块线程销毁TerminateThread
  6. 深度学习分类任务常用评估指标——总结(重点)
  7. java实现简单的订餐系统(面向对象+数组)
  8. 管易云和金蝶云星空接口打通对接实战
  9. 2021-06-03——CSS属性制作家用电器商品分类表
  10. jqgrid使用分析