数据结构学习之树结构

前段时间刚好在学习机器学习中的决策树,想起多年前学习树这个数据结构的场景,刚好借此机会回归一下知识点。

树是一种非常常见的数据结构,它由节点(Node)和边(Edge)构成。它有如下的一些特征:

  1. 根结点(Root Node):树有且只有一个根结点,它是树的顶端结点。

  2. 结点(Node):每个结点包含一个值或信息,除了根结点,每个结点都有一个父结点和零个或多个子结点。

  3. 边(Edge):连接两个结点的连线,表示结点之间的关系。

  4. 叶结点(Leaf Node):没有子结点的结点。

  5. 子结点(Child Node):直接连接在某结点下的结点。

  6. 父结点(Parent Node):直接连接在某结点上的结点。

  7. 子树(Subtree):由一个结点及其所有子结点组成的树。

根据树的节点情况,主要有下面的分类:

  1. 二叉树(Binary Tree):每个结点最多有两个子结点,称为左子结点和右子结点。

  2. 完全二叉树(Complete Binary Tree):除了最后一层,其他层的结点都填满了,最后一层的结点靠左排列。

  3. 满二叉树(Full Binary Tree):每个结点要么是叶结点,要么有两个子结点。

  4. 平衡二叉树(Balanced Binary Tree):左右子树的高度差不超过1的二叉树。

  5. 二叉搜索树(Binary Search Tree, BST):左子结点的值小于父结点的值,右子结点的值大于父结点的值。

树的真实应用很多,比如LInux系统中的文件系统结构就是树结构。

我用Python实现了这个文件系统的树结构,代码如下:

复制代码
class FileSystemNode:
    def __init__(self, name, is_directory=False):
        self.name = name
        self.is_directory = is_directory
        self.children = []

    def add_child(self, child_node):
        if self.is_directory:
            self.children.append(child_node)
        else:
            raise ValueError("Cannot add child to a file node")

    def __repr__(self, level=0):
        ret = "\t" * level + repr(self.name) + "\n"
        for child in self.children:
            ret += child.__repr__(level + 1)
        return ret

# 创建文件系统根目录
root = FileSystemNode("/", is_directory=True)

# 创建子目录和文件
home = FileSystemNode("home", is_directory=True)
var = FileSystemNode("var", is_directory=True)
etc = FileSystemNode("etc", is_directory=True)

user1 = FileSystemNode("user1", is_directory=True)
user2 = FileSystemNode("user2", is_directory=True)

documents = FileSystemNode("documents", is_directory=True)
pictures = FileSystemNode("pictures", is_directory=True)

file1 = FileSystemNode("file1.txt")
photo1 = FileSystemNode("photo1.jpg")

# 构建文件系统树
root.add_child(home)
root.add_child(var)
root.add_child(etc)

home.add_child(user1)
home.add_child(user2)

user1.add_child(documents)
user1.add_child(pictures)

documents.add_child(file1)
pictures.add_child(photo1)

# 打印文件系统树
print(root)

运行代码,可以得到输出如下所示:

复制代码
'/'
	'home'
		'user1'
			'documents'
				'file1.txt'
			'pictures'
				'photo1.jpg'
		'user2'
	'var'
	'etc'

可以看出这个文件夹结构是一个多叉树,一个父节点可以有多个子节点。

最开始说到的决策树也是一种树结构的应用。下面是用Python实现的树的定义和三种遍历算法:

复制代码
class TreeNode:
    def __init__(self, value=0, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


# 创建一个简单的二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)


# 前序遍历
def pre_order_traversal(node):
    if not node:
        return
    print(node.value, end=' ')
    pre_order_traversal(node.left)
    pre_order_traversal(node.right)

# 中序遍历
def mid_order_traversal(node):
    if not node:
        return
    mid_order_traversal(node.left)
    print(node.value, end=' ')
    mid_order_traversal(node.right)

# 后序遍历
def post_order_traversal(node):
    if not node:
        return
    post_order_traversal(node.left)
    post_order_traversal(node.right)
    print(node.value, end=' ')

# 调用前序遍历
pre_order_traversal(root)  # 输出:1 2 4 5 3
print("-------------------------\r\n")
mid_order_traversal(root)
print("-------------------------\r\n")
post_order_traversal(root)

明天在继续学习树的其他案例,日拱一卒,不负年华。

相关推荐
DreamLife☼11 分钟前
Agent与大语言模型的集成
windows·python·语言模型
BK贝壳5 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949657 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行11 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_9628857212 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI12 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿12 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫13 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots14 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq14 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python