Python -二叉树 创建与遍历算法(很详细,转自国外教程)
树表示由边连接的节点。它是一个非线性的数据结构。它具有以下特性。
- 一个节点被标记为根节点。
- 除根节点之外的每个节点都与一个父节点关联。
- 每个节点可以有一个arbiatry编号的chid节点。
我们使用前面讨论的os节点概念在python中创建了一个树数据结构。我们将一个节点指定为根节点,然后将更多的节点添加为子节点。下面是创建根节点的程序。
创建树
创建根
我们只需要创建一个节点类并向节点添加赋值。这就变成了只有根节点的树。
class Node:
def __init__(self, data):
self.left = None #左节点
self.right = None #右节点
self.data = data #值
def PrintTree(self):
print(self.data)
root = Node(10) #创建节点
root.PrintTree()
当执行上述代码时,将产生以下结果-
10
插入到树中
要插入到树中,我们使用上面创建的相同节点类,并向其添加一个插入类。insert类将节点的值与父节点的值进行比较,并决定将其添加为左节点或右节点。最后,PrintTree类用于打印树。
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
def insert(self, data):
# 将新值与父节点进行比较
if self.data: # 非空
if data < self.data: #新值较小,放左边
if self.left is None: #若空,则新建插入节点
self.left = Node(data)
else: #否则,递归往下查找
self.left.insert(data)
elif data > self.data: #新值较大,放右边
if self.right is None: #若空,则新建插入节点
self.right = Node(data)
else: #否则,递归往下查找
self.right.insert(data)
else:
self.data = data
# 打印这棵树,中序遍历
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# 使用insert方法添加节点
root = Node(12)
root.insert(6)
root.insert(14)
root.insert(3)
root.PrintTree()
当执行上述代码时,将产生以下结果-
3 6 12 14
遍历树
可以通过决定访问每个节点的序列来遍历树。我们可以清楚地看到,我们可以从一个节点开始,然后首先访问左子树,然后访问右子树。或者我们也可以先访问右子树然后访问左子树。因此,这些树遍历方法有不同的名称。我们将在实现树遍历算法的章节中详细研究它们。
Python树遍历算法
遍历是一个访问树的所有节点的过程,也可以打印它们的值。因为,所有节点都是通过边(链接)连接的,所以我们总是从根(头)节点开始。也就是说,我们不能随机访问树中的节点。我们走过一棵树有三种方法
- 先序遍历
- 中序遍历
- 后序遍历
顺序遍历
在这个遍历方法中,首先访问左子树,然后访问根,然后访问右子树。我们应该始终记住,每个节点都可以表示子树本身。 在下面的python程序中,我们使用Node类为根节点以及左右节点创建位置占位符。然后我们创建一个insert函数来向树中添加数据。最后,通过创建一个空列表并首先添加左节点,然后添加根节点或父节点来实现order遍历逻辑。最后添加左节点来完成order遍历。
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# 中序遍历
# Left -> Root -> Right
def inorderTraversal(self, root):
res = []
if root:
res = self.inorderTraversal(root.left)
res.append(root.data)
res = res + self.inorderTraversal(root.right)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.inorderTraversal(root))
当执行上述代码时,将产生以下结果-
[10、14、19、27、31、35、42]
预购遍历
在这种遍历方法中,首先访问根节点,然后访问左子树,最后访问右子树。 在下面的python程序中,我们使用Node类为根节点以及左右节点创建位置占位符。然后我们创建一个insert函数来向树中添加数据。最后,通过创建一个空列表并首先添加根节点,然后添加左节点来实现预排序遍历逻辑。最后添加正确的节点来完成预定遍历。请注意,此过程对每个子树重复,直到所有t
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# 先序遍历
# Root -> Left ->Right
def PreorderTraversal(self, root):
res = []
if root:
res.append(root.data)
res = res + self.PreorderTraversal(root.left)
res = res + self.PreorderTraversal(root.right)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PreorderTraversal(root))
当执行上述代码时,将产生以下结果-
[27, 14, 10, 19, 35, 31, 42]
后序遍历
在这个遍历方法中,根节点最后访问,因此得名。首先遍历左子树,然后遍历右子树,最后遍历根节点。
在下面的python程序中,我们使用Node类为根节点以及左右节点创建位置占位符。然后我们创建一个insert函数来向树中添加数据。最后,通过创建一个空列表并先添加左节点后添加右节点来实现后序遍历逻辑。最后添加根节点或父节点来完成后序遍历。请注意,此过程将对每个子树重复,直到遍历所有节点。
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# 后序遍历
# Left ->Right -> Root
def PostorderTraversal(self, root):
res = []
if root:
res = self.PostorderTraversal(root.left)
res = res + self.PostorderTraversal(root.right)
res.append(root.data)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PostorderTraversal(root))
当执行上述代码时,将产生以下结果-
[10、19、14、31、42、35、27]
- 如何使用supervisor管理你的应用
- Manjaro安装配置
- [Golang软件推荐] Frp内网穿透
- [Golang软件推荐] Golang通用连接池
- RxJS -- Subscription
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
- RxJS速成 (下)
- RxJS速成 (上)
- Typescript 查缺补漏
- Git -- Stash
- Git -- Rebase
- Git -- 分支与合并 (命令行+可视化工具p4merge) Fast Forward 合并禁用 Fast Forward 合并自动合并解决合并的冲突
- 使用Angular CLI进行单元测试和E2E测试
- Git - 使用命令和P4Merge进行diff
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
- Yii框架引入coreseek分页功能示例
- 使用keras内置的模型进行图片预测实例
- PHP convert_cyr_string()函数讲解
- 在keras中model.fit_generator()和model.fit()的区别说明
- 浅谈matplotlib 绘制梯度下降求解过程
- Ajax+PHP实现的分类列表框功能示例
- keras实现图像预处理并生成一个generator的案例
- Django+RestFramework API接口及接口文档并返回json数据操作
- Yii2框架实现利用mpdf创建pdf文件功能示例
- PHP超低内存遍历目录文件和读取超大文件的方法
- PHP bin2hex()函数基础实例讲解
- Kears 使用:通过回调函数保存最佳准确率下的模型操作
- django form和field具体方法和属性说明
- 总结PHP中初始化空数组的最佳方法