树表示由边连接的节点。它是一个非线性的数据结构。它具有以下特性。

  1. 一个节点被标记为根节点。
  2. 除根节点之外的每个节点都与一个父节点关联。
  3. 每个节点可以有一个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树遍历算法

遍历是一个访问树的所有节点的过程,也可以打印它们的值。因为,所有节点都是通过边(链接)连接的,所以我们总是从根(头)节点开始。也就是说,我们不能随机访问树中的节点。我们走过一棵树有三种方法

  1. 先序遍历
  2. 中序遍历
  3. 后序遍历

顺序遍历

在这个遍历方法中,首先访问左子树,然后访问根,然后访问右子树。我们应该始终记住,每个节点都可以表示子树本身。
在下面的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]

最新文章

  1. 使用IntelliJ IDEA 配置Maven(入门)(转)
  2. ARC的原理详解
  3. django初始
  4. Java-LinkedHashSet
  5. js实现鼠标右键自定义菜单(弹出层),并与树形菜单(TreeView)、iframe合用(兼容IE、Firefox、Chrome)
  6. jQuery基本选择器
  7. AJAX 数据库实例
  8. wamp设置实现本机IP或者局域网访问 (转)
  9. j2ee开发中的“java容器”和“web容器”有什么区别?
  10. Web项目
  11. MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
  12. 第一个Polymer应用 - (0)准备工作
  13. 彻底理解浏览器的缓存机制(http缓存机制)
  14. Ionic Android项目Splash设置
  15. 【2017 4 24 - B】 组合数
  16. Win8.1开机自启动程序
  17. 基于HTML5功能强大的滑块幻灯片
  18. POJ1639顶点度限制最小生成树
  19. 【Codeforces】CF 2 B The least round way(dp)
  20. 论文爬取 &amp; 词频统计2.0

热门文章

  1. 「Sqlserver」数据分析师有理由爱Sqlserver之九-无利益关系推荐Sqlserver书单
  2. Quartus ii调试技巧_01
  3. 小白学python-day03-系统位数、变量、用户输入、if else
  4. java并发笔记之java线程模型
  5. Android的简述
  6. JSP第一章动态网页的基础
  7. bean的创建(五)第一部分
  8. ASP.NET Core Web Api之JWT刷新Token(三)
  9. 非web下的PowerMockito单元测试
  10. 实时同步lsyncd