python实现二叉树
1.二叉树
-
关于树实际是编程中遇到数据结构,根节点之外每个节点都有一个父节点,根节点没有父节点,除叶子节点之外所有节点都有一个或是多个子叶子节点,父节点何子节点之间通过指针连接(Go/Java有指针的概念,简单说指针就是地址)
-
二叉树排序方式
- 广度遍历(层次遍历)
- 广度优先按照层次,一层一层遍历
- 深度遍历
- 前序:根左右(把跟放到最前面)
- 中序:左根右(把根放到中间)
- 后序:左右根(把根放到最后)
- 广度遍历(层次遍历)
2.排序二叉树
- 代码实现:
class Node():
"""封装节点对象"""
def __init__(self,item):
self.item = item
self.left = None
self.right = None
class Tree():
def __init__(self):
# 构造出一颗空的二叉树
# root要指向第一个节点的地址,如果root指向了None,则意味着该二叉树为空
self.root = None
def insert(self,item):
node = Node(item)
cur = self.root
if cur is None:
self.root = node
return
while True:
# 这里用while循环判断根,左,右节点是否为None逐级插入数据
if item < cur.item:
if cur.left is None:
cur.left = node
return
else:
cur = cur.left
else:
if cur.right is None:
cur.right = node
return
else:
cur = cur.right
def pre_sequence(self,root):
#前序
if root is None:
return
print(root.item,end = " ")
self.pre_sequence(root.left)
self.pre_sequence(root.right)
def middle_sequence(self,root):
#中序
if root is None:
return
self.middle_sequence(root.left)
print(root.item, end=" ")
self.middle_sequence(root.right)
def back_sequence(self,root):
#后续
if root is None:
return
self.back_sequence(root.left)
self.back_sequence(root.right)
print(root.item,end=" ")
def travel(self,root):
if root == None:
return
cur = root
# 队列先进先出
queue = [cur,]
while queue:
# 循环,pop,获取pop节点,左右子节点,不为None,加入队列继续循环
n = queue.pop(0)
print(n.item, end = " ")
if n.left != None:
queue.append(n.left)
if n.right != None:
queue.append(n.right)
tree = Tree()
tree.insert(3)
tree.insert(8)
tree.insert(5)
tree.insert(7)
tree.insert(6)
tree.pre_sequence(tree.root)#
print("\n")
tree.middle_sequence(tree.root)
print("\n")
tree.back_sequence(tree.root)
print("\n")
tree.travel(tree.root)
"""
打印结果:
前序:3 8 5 7 6
中序:3 5 6 7 8
后续:6 7 5 8 3
广度:3 8 5 7 6
"""
- 在执行insert方法时最终构建二叉树如下图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库