当前位置: 首页 > news >正文

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。

1. 新建二叉树节点模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DataStructure
{class TreeNode{public int Data { get; set; }public TreeNode Left { get; set; }public TreeNode Right { get; set; }public TreeNode(int data){Data = data;Left = null;Right = null;}}
}

2. 简单应用

using System;namespace DataStructure
{class Program{static async Task Main(string[] args){// 创建二叉树的根节点TreeNode root = new TreeNode(1);TreeNode node2 = new TreeNode(222);TreeNode node3 = new TreeNode(333);// 添加左子节点root.Left = node2;// 添加右子节点root.Right = node3;// 先序遍历二叉树并输出节点值Console.WriteLine("先序遍历二叉树:");PreorderTraversal(root);//添加新的节点TreeNode node4 = new TreeNode(444);TreeNode node5 = new TreeNode(555);TreeNode node6 = new TreeNode(666);TreeNode node7 = new TreeNode(777);TreeNode node8 = new TreeNode(888);node2.Left = node4;node2.Right = node5;node3.Left = node6;node3.Right = node7;node6 .Left = node8;Console.WriteLine("---");Console.WriteLine("先序遍历二叉树:");PreorderTraversal(root);}static void PreorderTraversal(TreeNode node){if (node != null){Console.Write(node.Data + " ");PreorderTraversal(node.Left);PreorderTraversal(node.Right);}}}
}

运行输出

3. 应用拓展

3.1 二叉树的应用场景

  • 文件系统和目录结构:在文件系统中,目录可以看作是节点,子目录就是子节点,文件可以是叶子节点。这种层次结构类似于二叉树(实际可能是多叉树,但原理类似),方便进行文件和目录的组织、查找和遍历。例如,当要在一个复杂的文件夹结构中查找特定文件时,就需要对这个树形结构进行遍历。
  • 表达式求值:二叉树可以用来表示数学表达式。例如,对于表达式(3 + 4) * 2,可以构建一棵二叉树,其中运算符*为根节点,3 + 42分别为左右子树。左子树又可以进一步展开,+为节点,34为其子节点。这样的表示方式有助于按照运算符的优先级来计算表达式的值。
  • 决策树:在机器学习和数据挖掘中,决策树是一种常用的分类和预测模型。每个节点代表一个属性上的测试,分支代表测试的输出,叶子节点代表类别或值。例如,在判断一个水果是苹果还是橙子时,可以根据颜色、形状等属性构建决策树来进行分类。
  • 霍夫曼编码:这是一种用于数据压缩的编码方式。霍夫曼树是一种二叉树,通过统计字符出现的频率构建。频率高的字符对应的编码路径短,频率低的字符编码路径长,从而实现数据的高效压缩。

3.2 关于二叉树常见的算法

3.2.1 遍历算法

  • 前序遍历:根节点 -> 左子树 -> 右子树
  • 中序遍历:左子树 -> 根节点 -> 右子树
  • 后序遍历:左子树 -> 右子树 -> 根节点

二叉树模型用第一小节的模型,分别演示三种遍历算法

using System;namespace DataStructure
{class Program{static async Task Main(string[] args){// 创建二叉树的根节点TreeNode root = new TreeNode(1);TreeNode node2 = new TreeNode(222);TreeNode node3 = new TreeNode(333);// 添加左子节点root.Left = node2;// 添加右子节点root.Right = node3;//添加新的节点TreeNode node4 = new TreeNode(444);TreeNode node5 = new TreeNode(555);TreeNode node6 = new TreeNode(666);TreeNode node7 = new TreeNode(777);TreeNode node8 = new TreeNode(888);node2.Left = node4;node2.Right = node5;node3.Left = node6;node3.Right = node7;node6.Left = node8;Console.WriteLine("先序遍历二叉树:");PreOrder(root);Console.WriteLine("");Console.WriteLine("中序遍历二叉树:");InOrder(root);Console.WriteLine("");Console.WriteLine("后序遍历二叉树:");PostOrder(root);}static void PreorderTraversal(TreeNode node){if (node != null){Console.Write(node.Data + " ");PreorderTraversal(node.Left);PreorderTraversal(node.Right);}}public static void PreOrder(TreeNode root){if (root == null) return;Console.Write(root.Data + " ");PreOrder(root.Left);PreOrder(root.Right);}public static void InOrder(TreeNode root){if (root == null) return;InOrder(root.Left);Console.Write(root.Data + " ");InOrder(root.Right);}public static void PostOrder(TreeNode root){if (root == null) return;PostOrder(root.Left);PostOrder(root.Right);Console.Write(root.Data + " ");}}
}

运行结果

相关文章:

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。 1. 新建二叉树节点模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataStructure {class TreeNode{public int Data { get;…...

树莓派2装FreeBSD14.1 Raspberry Pi2 install FreeBSD14.1 00000121:error:0A000086:SSL

树莓派2代的Model B采用Broadcom BCM2836 900MHz的四核SoC,1GB内存,是新一代开拓者,兼容1代B。相比之下,树莓派2的性能比1代提升6倍,内存翻了一番。Raspberry Pi 2不仅能跑全系列ARM GNU/Linux发行版,而且支…...

探索C/C++的奥秘之stack和queue

1. stack的介绍和使用 1.1 stack的介绍 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。具体什么是适配器呢?其实就是由现有的东西进行转换,转化出我要的东…...

[开源]1.2K star!中后台方向的低代码可视化平台,超赞!

大家好,我是JavaCodexPro! “时间就是金钱,效率就是生命”,快速搭建高质量中后台的低代码可视化搭建平台尤为重要! 今天JavaCodexPro给大家分享一款超赞的低代码可视化搭建平台 - Marsview ,旨在简化开发…...

算法编程题-排序

算法编程题-排序 比较型排序算法冒泡排序选择排序插入排序希尔排序堆排序快速排序归并排序 非比较型排序算法计数排序基数排序 本文将对七中经典比较型排序算法进行介绍,并且给出golang语言的实现,还包括基数排序、计数排序等非比较型的算法的介绍和实现…...

【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 💯前言💯准确引导ChatGPT创建爆款小红书文案GPTs指令案例💯 高效开发GPTs应用的核心原则明确应用场景和目标受众构建多样化风格模板提问与引导技巧持续优…...

【Axure高保真原型】或和且条件

今天和大家分享或和且条件案例的原型模板,效果包括: 可以选择指标、等式和填写对应值构成条件等式; 点击添加条件按钮,可以增加一行新的条件; 点击所在行的号按钮,可以在该行下方添加一行新的条件&#x…...

KubeVirt下gpu operator实践(GPU直通)

KubeVirt下gpu operator实践(GPU直通) 参考《在 KubeVirt 中使用 GPU Operator》,记录gpu operator在KubeVirt下实践的过程,包括虚拟机配置GPU直通,容器挂载GPU设备等。 KubeVirt 提供了一种将主机设备分配给虚拟机的机制。该机制具有通用性…...

Vue通过file控件上传文件到Node服务器

功能: 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …...

如何在 SQL Server 中新增账户并指定数据库权限

在日常的数据库维护与开发中,管理用户的权限是必不可少的一环。本文将指导你如何在 SQL Server 中为新用户创建账户,并为其指定相应的数据库权限,使其只能查看有权访问的数据。我们将以步骤和代码示例的方式展示整个流程。用户权限分配包括:读取权限、写入权限、执行权限。…...

c#编码技巧(十九):各种集合特点汇总

.NET 常用集合对比: .NET 常见的线程安全集合 .NET 只读集合...

汽车软件DevOps解决方案

汽车软件DevOps解决方案是专为现代汽车行业设计的一套集成化需求、开发、测试、部署、OTA与监控,旨在加速软件开发流程,提高软件质量和安全性,同时确保整个生命周期的高效性和灵活性。以下是经纬恒润汽车软件DevOps解决方案的关键组成部分和优…...

同步的意义以及机制

一、同步的意义 同步(Synchronization)的意义在于确保在多线程环境中,多个线程对共享资源的访问是安全的,避免竞争条件(race conditions)和数据不一致的情况。 具体来说,同步的核心目标是&…...

leetcode 面试150之 156.LUR 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -…...

启发式搜索算法复现

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月21日19点05分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...

【IDE】使用指南

定期更新实用技能,建议关注收藏点赞。 友情链接: 点击跳转常见代码编辑器的报错解决方案 目录 常用快捷键pycharm右下角边栏脚本头安装IDE的插件git配置TODO 代码编辑器里有许多小技巧,便于办公。本篇主要以pycharm,vscode等主流常用IDE为…...

设计编程网站集:简述可扩展性系统设计(笔记)

视频连接:简述可扩展性系统设计 三个关键原则 无状态 松散耦合 异步处理 扩展 负载均衡 缓存 分片...

「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解

本篇将介绍 Cangjie 中的布尔类型,包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用,帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...

Fashion-VDM:引领视频虚拟试穿技术的新篇章

引言 随着虚拟现实和增强现实技术的飞速发展,视频虚拟试穿(VVT)已成为时尚产业的一大创新领域。然而,现有的VVT方法在服装细节和时间一致性方面仍存在诸多不足。为了解决这些问题,Johanna Karras等人提出了Fashion-VDM,一种基于视频扩散模型(VDM)的新型视频虚拟试穿技…...

Scala中的集合复习(1)

Map、Set、Array、List 一、集合的三大类 1.序列Seq表示有先后顺序的集合。(Array、List) 2.集Set:表示无序且不重复的集合。 3.映射Map:表示键值对。 Stack:栈,特点是:后进先出。 packag…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...