python实现树的遍历
二叉树的遍历是指按照某种顺序依次访问树中的所有节点一次。
四种遍历方式分别是:先序遍历、中序遍历、后序遍历、层序遍历。其中前三种属于深度优先遍历(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实现树的遍历相关推荐
- python 标签树的遍历
下行遍历: .contents:字节点列表,将<tag>所有儿子节点存入列表 他的儿子,就是title. body的儿子还有\n,对呀.这个也算是一个节点! (比例不对就用放大镜查看!嘿嘿 ...
- python作者 google面试_如果Google面试让你用python写一个树的遍历程序
前几天忽然对python很感兴趣,学了几天也感觉它非常的简洁实用.打破了我这么长时间对java C# C 和vb的审美疲劳,让我眼前一亮."就像读英文一样简单"这句话评价pytho ...
- 树的遍历(python)
树的遍历Tree Traversals ❖对一个数据集中的所有数据项进行访问的操作称为"遍历Traversal" ❖线性数据结构中,对其所有数据项的访问比较简单直接按照顺序依次进行 ...
- LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历--递归,迭代--反向压栈--C++解法
LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历–递归,迭代–反向压栈–C++解法 LeetCode题解专栏:LeetCode题解 LeetC ...
- python数据结构 树_python 数据结构四 之 二叉树和树
python数据结构教程第四课 树形结构是复杂结构中最简单的一类,这是一类非常重要的结构,在实际中使用广泛,反映了许多计算过程的抽象结构 一.简介 1.树 2.二叉树 二.二叉树和树的抽象数据类型(A ...
- 树的遍历(中序,前序,后序)
与只有一种逻辑遍历它们的线性数据结构(数组.链表.队列.堆栈等)不同,树可以以不同的方式遍历,常见的有中序遍历,前序遍历和后序遍历. 实现各种遍历的方法又包括: 以上图为例: 深度优先遍历: (a) ...
- mysql 遍历_MySQL 实现树的遍历详解及简单实现示例
MySQL 实现树的遍历 经常在一个表中有父子关系的两个字段,比如empno与manager,这种结构中需要用到树的遍历.在Oracle 中可以使用connect by简单解决问题,但MySQL 5. ...
- 那些妖术——树的遍历
本文参加CSDN博客大赛,如果你喜欢请投一票,非常感谢! 这个方法有点邪门,和大家在课堂上学的有点不一样,所以blog的名字取得有点邪乎. 一般的程序员应聘技术类的笔试都会有一道题目,那就是树的遍历( ...
- LeetCode总结 -- 树的遍历篇
遍历树的数据结构中最常见的操作. 能够说大部分关于树的题目都是环绕遍历进行变体来解决的. 一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历. 那么一般递归的解法就过于简单了. 面试官 ...
最新文章
- centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
- 关于海量数据查找排序问题
- BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA
- 成员函数指针与高性能的C++委托
- java world_Java World中的GraphQL简介
- Linux之Shell管理脚本(一)
- 修改linux端口22,修改LINUX 默认的22端口
- Python3中如何做的自定义模块的引用?
- 华悦网游器软件介绍及功能介绍
- 教你itunes电脑版怎么下载
- [分享]下载电影文件英文标识的含义
- 用python预测超车是否危险_用Python预测泰坦尼克号乘客生存情况
- 【FPGA】:ip核---乘法器(multiplier)
- ios手机页面滑动卡顿问题
- 计算机发展简史 计算机的发展历史介绍
- Vue 安装echarts-gl引入vue报错
- 使用Python提取txt文件中的数据到excel中
- 树莓派4b移植4G USB驱动Quectel EC200T以及ppp拨号
- 【Linux】从冯诺依曼体系到初识Linux下的进程