【数据结构4】树的实例-模拟文件系统、二叉树的遍历(先序遍历、中序遍历、后序遍历、层次遍历)

本文主要是介绍【数据结构4】树的实例-模拟文件系统、二叉树的遍历(先序遍历、中序遍历、后序遍历、层次遍历),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 树和二叉树
2 树的实例-模拟文件系统
3 二叉树
3.1 二叉树的遍历
二叉树的先序遍历
二叉树的中序遍历
二叉树的后序遍历
二叉树的层次遍历

1 树

树是一种数据结构
比如:目录结构
树是一种可以递归定义的数据结构树是由n个节点组成的集合:如果n=0,那这是一棵空树;如果n>0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一棵树

在这里插入图片描述

2 树的实例-模拟文件系统

class Node:"""表示文件系统树中的一个节点。属性:name (str): 节点的名称。对于目录,它以 '/' 结尾,对于文件,不以 '/' 结尾。type (str): 节点的类型,'dir' 代表目录,'file' 代表文件。children (list): 该节点的子节点列表。仅对目录节点有效。parent (Node): 该节点的父节点。如果是根节点,则为 None。"""def __init__(self, name, type='dir'):"""初始化一个新的节点。:param name: 节点的名称。目录名称通常以 '/' 结尾,文件名称不以 '/' 结尾。:param type: 节点的类型。默认为 'dir'(目录),可以设置为 'file'(文件)以表示文件节点。"""self.name = nameself.type = typeself.children = []  # 初始化为空列表,目录节点可以包含子节点self.parent = None  # 父节点初始化为 Nonedef __repr__(self):return self.nameclass FileSystemTree:"""表示一个文件系统树,支持创建目录、列出目录内容以及切换目录等操作。属性:root (Node): 文件系统树的根节点,初始化时创建。now (Node): 当前工作目录。操作会影响该目录。"""def __init__(self):"""初始化文件系统树,创建根目录,并将当前工作目录设置为根目录。"""self.root = Node("/")  # 创建根目录,名称为 "/"self.now = self.root  # 将当前工作目录设置为根目录def mkdir(self, name):"""在当前工作目录下创建一个新的目录。:param name: 新目录的名称。必须以 '/' 结尾。如果没有结尾的 '/', 会自动添加。"""if name[-1] != "/":  # 检查目录名称是否以 '/' 结尾name += '/'  # 添加 '/' 以确保目录名称正确node = Node(name)  # 创建新的目录节点self.now.children.append(node)  # 将新目录添加到当前工作目录的子节点列表中node.parent = self.now  # 设置新目录的父节点为当前工作目录def ls(self):"""展示当前工作目录下的所有子节点。:return: 当前目录下的子节点列表(包括目录和文件)。"""return self.now.children  # 返回当前目录的子节点列表def cd(self, name):"""切换到指定的目录。支持绝对路径和相对路径。:param name: 目标目录的路径。可以是绝对路径(以 '/' 开头)或相对路径(不以 '/' 开头)。:return: 无返回值。成功切换目录时,更新当前工作目录。:raises ValueError: 如果指定的路径无效或目录不存在,抛出异常。"""if name[-1] != "/":  # 确保目录名称以 '/' 结尾name += '/'# 处理路径components = name.split('/')  # 将路径分解为各个部分node = self.now  # 从当前工作目录开始遍历for component in components:if component == '..':# 如果路径部分是 '..',则返回到上一级目录if node.parent is not None:node = node.parentelif component and component != '/':# 如果路径部分是有效的目录名,则查找该目录found = Falsefor child in node.children:if child.name == component + '/':node = child  # 找到目标目录,更新当前节点found = Truebreakif not found:# 如果没有找到目标目录,则抛出异常raise ValueError('无效的目录')self.now = node  # 更新当前工作目录为目标目录tree = FileSystemTree()
tree.mkdir('var/')
tree.mkdir('bin/')
tree.mkdir('bin/python')
tree.mkdir('usr/')print(tree.root.children)
print(tree.ls())
print(tree.cd('bin/'))
tree.cd("../")
print(tree.ls())

3 二叉树

二叉树的链式存储:将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方式来连接。节点定义:
class BiTreeNode:def __init__(self, data):self.data = dataself.lchild = Noneself.rchild = None

**实现这棵二叉树**
在这里插入图片描述

class BiTreeNode:def __init__(self, data):self.data = dataself.lchild = None  # 左孩子self.rchild = None  # 右孩子a = BiTreeNode('A')
b = BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = froot = e
print(root.lchild.rchild.data)

3.1 二叉树的遍历

在这里插入图片描述

二叉树的前序遍历

def pre_order(root):"""二叉树的前序遍历:param root::return:"""if root:print(root.data, end=',')pre_order(root.lchild)pre_order(root.rchild)pre_order(root)  # E,A,C,B,D,G,F,

二叉树的中序遍历

def mid_order(root):"""二叉树的中序遍历:param root::return:"""if root:mid_order(root.lchild)print(root.data, end=',')mid_order(root.rchild)mid_order(root)  # A,B,C,D,E,G,F,

二叉树的后序遍历

def post_order(root):"""二叉树的后序遍历:param root::return:"""if root:post_order(root.lchild)post_order(root.rchild)print(root.data, end=',')post_order(root)  # A,C,B,D,G,F,E

二叉树的层次遍历

from collections import dequedef level_order(root):"""层次遍历二叉树的函数:param root: 二叉树的根节点:return: None"""# 初始化一个队列,用于层次遍历queue = deque()# 将根节点入队queue.append(root)# 当队列不为空时,继续遍历while len(queue) > 0:# 从队列中取出一个节点node = queue.popleft()# 打印当前节点的数据print(node.data, end=',')# 如果当前节点有左子节点,将左子节点入队if node.lchild:queue.append(node.lchild)# 如果当前节点有右子节点,将右子节点入队if node.rchild:queue.append(node.rchild)level_order(root)  # E,A,G,C,F,B,D,

这篇关于【数据结构4】树的实例-模拟文件系统、二叉树的遍历(先序遍历、中序遍历、后序遍历、层次遍历)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104235

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点