python数据结构之二叉树的遍历实例
遍历方案
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
1).访问结点本身(N)
2).遍历该结点的左子树(L)
3).遍历该结点的右子树(R)
有次序:
NLR、LNR、LRN
遍历的命名
根据访问结点操作发生位置命名:
NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。
LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。
LRN:后序遍历(PostorderTraversal) ——访问结点的操作发生在遍历其左右子树之后。
注:由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
遍历算法
1).先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
a.访问根结点
b.遍历左子树
c.遍历右子树
2).中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
a.遍历左子树
b.访问根结点
c.遍历右子树
3).后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
a.遍历左子树
b.遍历右子树
c.访问根结点
一、二叉树的递归遍历:
# -*- coding: utf - 8 - *-
class TreeNode(object): def __init__(self, left=0, right=0, data=0):
self.left = left
self.right = right
self.data = data class BTree(object): def __init__(self, root=0):
self.root = root def is_empty(self):
if self.root is 0:
return True
else:
return False def preorder(self, treenode):
'前序(pre-order,NLR)遍历'
if treenode is 0:
return
print(treenode.data)
self.preorder(treenode.left)
self.preorder(treenode.right) def inorder(self, treenode):
'中序(in-order,LNR'
if treenode is 0:
return
self.inorder(treenode.left)
print(treenode.data)
self.inorder(treenode.right) def postorder(self, treenode):
'后序(post-order,LRN)遍历'
if treenode is 0:
return
self.postorder(treenode.left)
self.postorder(treenode.right)
print(treenode.data) node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root') bt = BTree(root) print(u''' #生成的二叉树 # ------------------------
# root
# 7 8
# 6
# 2 5
# 1 3 4
#
# ------------------------- ''')
print('前序(pre-order,NLR)遍历 :\n')
bt.preorder(bt.root) print('中序(in-order,LNR) 遍历 :\n')
bt.inorder(bt.root) print('后序(post-order,LRN)遍历 :\n')
bt.postorder(bt.root)
输出:
#生成的二叉树 # ------------------------
# root
# 7 8
# 6
# 2 5
# 1 3 4
#
# ------------------------- 前序(pre-order,NLR)遍历 : root
7
6
2
1
5
3
4
8
中序(in-order,LNR) 遍历 : 1
2
6
3
5
4
7
root
8
后序(post-order,LRN)遍历 : 1
2
3
4
5
6
7
8
root
二、.二叉树的非递归遍历
下面就用非递归的方式实现一遍。主要用到了 stack 和 queue维护一些数据节点:
# -*- coding: utf - 8 - *-
class TreeNode(object): def __init__(self, left=0, right=0, data=0):
self.left = left
self.right = right
self.data = data class BTree(object): def __init__(self, root=0):
self.root = root def is_empty(self):
if self.root is 0:
return True
else:
return False def preorder(self, treenode):
'前序(pre-order,NLR)遍历'
stack = []
while treenode or stack:
if treenode is not 0:
print(treenode.data)
stack.append(treenode)
treenode = treenode.left
else:
treenode = stack.pop()
treenode = treenode.right def inorder(self, treenode):
'中序(in-order,LNR) 遍历'
stack = []
while treenode or stack:
if treenode:
stack.append(treenode)
treenode = treenode.left
else:
treenode = stack.pop()
print(treenode.data)
treenode = treenode.right # def postorder(self, treenode):
# stack = []
# pre = 0
# while treenode or stack:
# if treenode:
# stack.append(treenode)
# treenode = treenode.left
# elif stack[-1].right != pre:
# treenode = stack[-1].right
# pre = 0
# else:
# pre = stack.pop()
# print pre.data def postorder(self, treenode):
'后序(post-order,LRN)遍历'
stack = []
queue = []
queue.append(treenode)
while queue:
treenode = queue.pop()
if treenode.left:
queue.append(treenode.left)
if treenode.right:
queue.append(treenode.right)
stack.append(treenode)
while stack:
print(stack.pop().data) def levelorder(self, treenode):
from collections import deque
if not treenode:
return
q = deque([treenode])
while q:
treenode = q.popleft()
print(treenode.data)
if treenode.left:
q.append(treenode.left)
if treenode.right:
q.append(treenode.right) node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root') bt = BTree(root) print(u''' #生成的二叉树 # ------------------------
# root
# 7 8
# 6
# 2 5
# 1 3 4
#
# ------------------------- ''')
print('前序(pre-order,NLR)遍历 :\n')
bt.preorder(bt.root) print('中序(in-order,LNR) 遍历 :\n')
bt.inorder(bt.root) print('后序(post-order,LRN)遍历 :\n')
bt.postorder(bt.root) print('层序(level-order,LRN)遍历 :\n')
bt.levelorder(bt.root)
输出:
#生成的二叉树 # ------------------------
# root
# 7 8
# 6
# 2 5
# 1 3 4
#
# ------------------------- 前序(pre-order,NLR)遍历 : root
7
6
2
1
5
3
4
8
中序(in-order,LNR) 遍历 : 1
2
6
3
5
4
7
root
8
后序(post-order,LRN)遍历 : 1
2
3
4
5
6
7
8
root
层序(level-order,LRN)遍历 : root
7
8
6
2
5
1
3
4
python数据结构之二叉树的遍历实例的更多相关文章
- python数据结构之二叉树的建立实例
先建立二叉树节点,有一个data数据域,left,right 两个指针域 # coding:utf-8 class TreeNode(object): def __init__(self,left=N ...
- python数据结构之二叉树的统计与转换实例
python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...
- 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现
文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...
- 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)
前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...
- 【PHP数据结构】二叉树的遍历及逻辑操作
上篇文章我们讲了许多理论方面的知识,虽说很枯燥,但那些都是我们今天学习的前提,一会看代码的时候你就会发现这些理论知识是多么地重要了.首先,我们还是要说明一下,我们学习的主要内容是二叉树,因为二叉树是最 ...
- python数据结构之二叉树遍历的实现
本篇是实现二叉树的三种遍历,先序遍历,中序遍历,后序遍历 #!/usr/bin/python # -*- coding: utf-8 -*- class TreeNode(object): def _ ...
- Python数据结构之二叉树
本来打算一个学期分别用C++.Python.Java实现数据结构,看来要提前了 这个是Python版本,我写的数据结构尽量保持灵活性,本文bt1是一般的插入法建立二叉树结构,bt2就是可以任意输入,至 ...
- python数据结构之二叉树的实现
树的定义 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- python 数据结构之二叉树
二叉树关键在构建和遍历,python实现相对简单,我们在实现需要用到类,分别设置爱左右子树,根节点,然后从根进行遍历,进行判断,若为空进行树的构建,非空则返回到列表中即可,我在进行遍历时产生了一个错误 ...
随机推荐
- Htmlcss学习笔记2——选择器与常用样式
CSS引入类型 行内样式 内联样式 外部样式表 CSS选择器 基本选择器 复合选择器 伪类选择器 属性选择器 CSS字体样式 font-size font-family font-style font ...
- Python开发的入门教程(六)-函数
介绍 本文主要介绍Python中函数的基本知识和使用 Python之什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同 ...
- Transform与Vector3 的API
Transform.InverseTransformDirection(Vector3 direction) Vector3.ProjectOnPlane(Vector3 vector, Vector ...
- java返回树形结构的正确姿势
业务场景 通常我们前端需要一个树形的导航菜单或者分类菜单,如后台权限管理中的权限树,亦或者下面例子中商城系统的商品分类多级菜单(一般为三级菜单) 数据库设计 数据库设计,采用parentId来指向自己 ...
- JS中有趣的内置对象-JSON
前言 在以前的web开发中,我们多数选择纯文本或XML作为我们的提交的数据格式,大多数是XML,少数纯文本.其实从AJAX(Asynchronous JavaScript and XML)的命名我们也 ...
- [oracle/sql]写SQL从学生考试成绩三表中选出五门分综合超过720的尖子
任务:有学生,科目,考分三张表,需要从中筛选出五门考分总和超过720的学生. 科目表最简单只有五条记录: CREATE TABLE tb_course ( id NUMBER not null pri ...
- 从一知半解到揭晓Java高级语法—泛型
目录 前言 探讨 泛型解决了什么问题? 扩展 引入泛型 什么是泛型? 泛型类 泛型接口 泛型方法 类型擦除 擦除的问题 边界 通配符 上界通配符 下界通配符 通配符和向上转型 泛型约束 实践总结 泛型 ...
- SSM框架整合核心内容
所需要的jar包及其版本 Spring 版本:4.3.18 tx.aop.beans.core.web.web-mvc.context.expression.jdbc MyBatis:3.4.6 ...
- redis并发问题2
转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485464&idx=1&sn=8d690fc6f878 ...
- python文档翻译之python说明
3.1使用Python进行计数 让我们来使用一些Python的简单命令,通过终端启动解释器等待出现>>>. 3.1.1数值类型 在终端中输入数学表达式,Python解释器会执行这些表 ...