C#二叉树

C#二叉树

二叉树是一种常见的数据结构,它是由节点组成的一种树形结构,其中每个节点最多有两个子节点。二叉树的一个节点通常包含三部分:存储数据的变量、指向左子节点的指针和指向右子节点的指针。二叉树可以用于多种算法和操作,如搜索、排序和遍历。

在这里插入图片描述

二叉树遍历

遍历方式顺序C#递归实现核心代码
前序遍历根 → 左 → 右Console.Write(root.val); → 递归左 → 递归右
中序遍历左 → 根 → 右递归左 → Console.Write(root.val); → 递归右
后序遍历左 → 右 → 根递归左 → 递归右 → Console.Write(root.val);

二叉树的应用场景

  1. 快速查找与排序
    • 二叉搜索树用于实现字典、数据库索引(如B树、B+树的基础)。
  2. 表达式树
    • 编译器解析数学表达式时构建二叉树,叶节点为操作数,非叶节点为运算符。
  3. 哈夫曼编码
    • 通过构建最优二叉树实现数据压缩。
  4. 决策树与机器学习
    • 二叉树结构用于分类和回归模型的决策过程。

二叉树的优缺点

优点缺点
逻辑清晰,易于实现递归操作普通二叉树可能退化为链表(时间复杂度升至O(n))
二叉搜索树支持高效查找/插入平衡二叉树实现复杂(如AVL树的旋转操作)
天然适合分治算法(如快速排序)存储指针占用额外内存空间
实例1
using System;
using System.Collections.Generic;public class TreeNode
{public int val;public TreeNode left;public TreeNode right;public TreeNode(int x) { val = x; }
}class BinaryTreeDemo
{static void Main(){// 构建二叉树TreeNode root = new TreeNode(1){left = new TreeNode(2){left = new TreeNode(4),right = new TreeNode(5)},right = new TreeNode(3)};Console.WriteLine("前序遍历:");PreOrder(root); // 输出: 1 2 4 5 3Console.WriteLine("\n层序遍历:");LevelOrder(root); // 输出: 1 2 3 4 5}// 前序遍历static void PreOrder(TreeNode root){if (root == null) return;Console.Write(root.val + " ");PreOrder(root.left);PreOrder(root.right);}// 层序遍历static void LevelOrder(TreeNode root){if (root == null) return;Queue<TreeNode> queue = new Queue<TreeNode>();queue.Enqueue(root);while (queue.Count > 0){TreeNode node = queue.Dequeue();Console.Write(node.val + " ");if (node.left != null) queue.Enqueue(node.left);if (node.right != null) queue.Enqueue(node.right);}}
}
实例2
public class TreeNode<T>
{public T Value { get; set; }public TreeNode<T> Left { get; set; }public TreeNode<T> Right { get; set; }public TreeNode(T value){Value = value;Left = null;Right = null;}
}public class BinaryTree<T>
{public TreeNode<T> Root { get; private set; }public BinaryTree(){Root = null;}// 插入新值到二叉树中public void Add(T value){if (Root == null){Root = new TreeNode<T>(value);}else{AddTo(Root, value);}}private void AddTo(TreeNode<T> node, T value){if (Comparer<T>.Default.Compare(value, node.Value) < 0){if (node.Left == null){node.Left = new TreeNode<T>(value);}else{AddTo(node.Left, value);}}else{if (node.Right == null){node.Right = new TreeNode<T>(value);}else{AddTo(node.Right, value);}}}// 前序遍历(根-左-右)public void PreOrderTraversal(TreeNode<T> node){if (node != null){Console.WriteLine(node.Value); // 访问节点PreOrderTraversal(node.Left);   // 遍历左子树PreOrderTraversal(node.Right);  // 遍历右子树}}// 中序遍历(左-根-右)public void InOrderTraversal(TreeNode<T> node){if (node != null){InOrderTraversal(node.Left);   // 遍历左子树Console.WriteLine(node.Value); // 访问节点InOrderTraversal(node.Right);  // 遍历右子树}}// 后序遍历(左-右-根)public void PostOrderTraversal(TreeNode<T> node){if (node != null){PostOrderTraversal(node.Left);   // 遍历左子树PostOrderTraversal(node.Right);  // 遍历右子树Console.WriteLine(node.Value);   // 访问节点}}
}
实例3
class BSTDemo
{static void Main(){TreeNode root = null;// 插入节点root = InsertBST(root, 5);InsertBST(root, 3);InsertBST(root, 7);InsertBST(root, 2);Console.WriteLine("中序遍历BST:");InOrder(root); // 输出: 2 3 5 7// 删除节点3root = DeleteNode(root, 3);Console.WriteLine("\n删除后:");InOrder(root); // 输出: 2 5 7}// BST插入static TreeNode InsertBST(TreeNode root, int val){if (root == null) return new TreeNode(val);if (val < root.val)root.left = InsertBST(root.left, val);elseroot.right = InsertBST(root.right, val);return root;}// BST删除(使用之前定义的DeleteNode方法)// 中序遍历static void InOrder(TreeNode root){if (root == null) return;InOrder(root.left);Console.Write(root.val + " ");InOrder(root.right);}
}
实例4
class SymmetricTreeDemo
{static void Main(){// 对称二叉树TreeNode root1 = new TreeNode(1){left = new TreeNode(2) { left = new TreeNode(3), right = new TreeNode(4) },right = new TreeNode(2) { left = new TreeNode(4), right = new TreeNode(3) }};// 非对称二叉树TreeNode root2 = new TreeNode(1){left = new TreeNode(2) { right = new TreeNode(3) },right = new TreeNode(2) { right = new TreeNode(3) }};Console.WriteLine("root1是否对称: " + IsSymmetric(root1)); // trueConsole.WriteLine("root2是否对称: " + IsSymmetric(root2)); // false}static bool IsSymmetric(TreeNode root){if (root == null) return true;return CheckSymmetric(root.left, root.right);}static bool CheckSymmetric(TreeNode left, TreeNode right){if (left == null && right == null) return true;if (left == null || right == null) return false;return left.val == right.val && CheckSymmetric(left.left, right.right)&& CheckSymmetric(left.right, right.left);}
}
实例5
class DepthDemo
{static void Main(){TreeNode root = new TreeNode(1){left = new TreeNode(2) { left = new TreeNode(4) },right = new TreeNode(3)};Console.WriteLine("最大深度: " + MaxDepth(root)); // 输出: 3}static int MaxDepth(TreeNode root){if (root == null) return 0;return Math.Max(MaxDepth(root.left), MaxDepth(root.right)) + 1;}
}
实例6
class PathSumDemo
{static void Main(){TreeNode root = new TreeNode(5){left = new TreeNode(4) { left = new TreeNode(11) { left = new TreeNode(7), right = new TreeNode(2) } },right = new TreeNode(8) { left = new TreeNode(13), right = new TreeNode(4) { right = new TreeNode(1) } }};Console.WriteLine("是否存在和为22的路径: " + HasPathSum(root, 22)); // true}static bool HasPathSum(TreeNode root, int targetSum){if (root == null) return false;if (root.left == null && root.right == null)return root.val == targetSum;return HasPathSum(root.left, targetSum - root.val) || HasPathSum(root.right, targetSum - root.val);}
}

关键点总结

  1. 递归思想:二叉树问题多通过递归解决,注意终止条件(root == null
  2. BST特性:插入/删除时利用左小右大规则
  3. 遍历选择
    • 前序:根节点最先访问
    • 中序:BST会得到有序序列
    • 层序:需要队列辅助
  4. 空间复杂度
    • 递归:O(h)(h为树高)
    • 层序:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm真入门(11)——ComboBox控件详解

WinForm中 ComboBox 控件详解‌ ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件&#xff0c;支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析&#xff1a; 一、ComboBox 核心属性‌ 属性说明示例‌Items‌下拉…

超详细解读:数据库MVCC机制

之前文章&#xff1a;Mysql锁_exclusivelock for update写锁-CSDN博客 中有提到通过MVCC来实现快照读&#xff0c;从而解决幻读问题&#xff0c;这里详细介绍下MVCC。 一、前言 表1&#xff1a;实例表t idk1122 表2&#xff1a;事务A、B、C的执行流程 事务A事务B事务Cstart …

【SpringCloud】从入门到精通【上】

今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了&#xff0c;虽然在看视频的时候也记了笔记&#xff0c;但是看完之后还是忘得差不多了&#xff0c;所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…

AI平台如何实现推理?数算岛是一个开源的AI平台(主要用于管理和调度分布式AI训练和推理任务。)

数算岛是一个开源的AI平台&#xff0c;主要用于管理和调度分布式AI训练和推理任务。它基于Kubernetes构建&#xff0c;支持多种深度学习框架&#xff08;如TensorFlow、PyTorch等&#xff09;。以下是数算岛实现模型推理的核心原理、架构及具体实现步骤&#xff1a; 一、数算岛…

cesium项目之cesiumlab地形数据加载

之前的文章我们有提到&#xff0c;使用cesiumlab加载地形出现了一些错误&#xff0c;没有解决&#xff0c;今天作者终于找到了解决方法&#xff0c;下面描述一下具体步骤&#xff0c;首先在地理数据云下载dem数据&#xff0c;在cesiumlab中使用地形切片&#xff0c;得到terrain…

[Vue]App.vue讲解

页面中可以看见的内容不再在index.html中进行编辑&#xff0c;而是在App.vue中进行编辑。 组件化开发 在传统的html开发中&#xff0c;一个页面的资源往往都写在同一个html文件中。这种模式在开发小规模、样式简单的项目时会相当便捷&#xff0c;但当项目规模越来越大&#xf…

sql-labs靶场 less-1

文章目录 sqli-labs靶场less 1 联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…

蓝桥杯-小明的彩灯(差分)

问题描述&#xff1a; 差分数组 1. 什么是差分数组&#xff1f; 差分数组 c 是原数组 a 的“差值表示”&#xff0c;其定义如下&#xff1a; c[0] a[0]c[i] a[i] - a[i-1] &#xff08;i ≥ 1&#xff09; 差分数组记录了相邻元素的差值。例如&#xff0c;原数组 a [1, …

精品可编辑PPT | 基于湖仓一体构建数据中台架构大数据湖数据仓库一体化中台解决方案

本文介绍了基于湖仓一体构建数据中台架构的技术创新与实践。它详细阐述了数据湖、数据仓库和数据中台的概念&#xff0c;分析了三者的区别与协作关系&#xff0c;指出数据湖可存储大规模结构化和非结构化数据&#xff0c;数据仓库用于高效存储和快速查询以支持决策&#xff0c;…

最近api.themoviedb.org无法连接的问题解决

修改NAS的host需要用到SSH终端连接工具&#xff0c;比如常见的Putty&#xff0c;XShell&#xff0c;或者FinalShell等都可以&#xff0c;我个人还是习惯Putty。 1.输入命令“ sudo -i ”回车&#xff0c;提示输入密码&#xff0c;密码就是我们NAS的登录密码&#xff0c;输入的…

0.机器学习基础

0.人工智能概述&#xff1a; &#xff08;1&#xff09;必备三要素&#xff1a; 数据算法计算力 CPU、GPU、TPUGPU和CPU对比&#xff1a; GPU主要适合计算密集型任务&#xff1b;CPU主要适合I/O密集型任务&#xff1b; 【笔试问题】什么类型程序适合在GPU上运行&#xff1…

多类型医疗自助终端智能化升级路径(代码版.下)

医疗人机交互层技术实施方案 一、多模态交互体系 1. 医疗语音识别引擎 # 基于Wav2Vec2的医疗ASR系统 from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC import torchaudioclass MedicalASR:def __init__(self):self.processor = Wav2Vec2Processor.from_pretrai…

前端基础:React项目打包部署服务器教程

问题背景 我做了一个React框架的前端的Node项目&#xff0c;是一个单页面应用。 页面路由用的是&#xff0c;然后使用了React.lazy在路由层级对每一个不同页面进行了懒加载&#xff0c;只有打开那个页面才会加载对应资源。 然后现在我用了Webpack5对项目进行了打包&#xff…

【深度学习:理论篇】--Pytorch基础入门

目录 1.Pytorch--安装 2.Pytorch--张量 3.Pytorch--定义 4.Pytorch--运算 4.1.Tensor数据类型 4.2.Tensor创建 4.3.Tensor运算 4.4.Tensor--Numpy转换 4.5.Tensor--CUDA&#xff08;GPU&#xff09; 5.Pytorch--自动微分 &#xff08;autograd&#xff09; 5.1.back…

使用 Spring Boot 快速构建企业微信 JS-SDK 权限签名后端服务

使用 Spring Boot 快速构建企业微信 JS-SDK 权限签名后端服务 本篇文章将介绍如何使用 Spring Boot 快速构建一个用于支持企业微信 JS-SDK 权限校验的后端接口&#xff0c;并提供一个简单的 HTML 页面进行功能测试。适用于需要在企业微信网页端使用扫一扫、定位、录音等接口的…

工程师 - FTDI SPI converter

中国网站&#xff1a;FTDIChip- 首页 UMFT4222EV-D UMFT4222EV-D - FTDI 可以下载Datasheet。 UMFT4222EVUSB2.0 to QuadSPI/I2C Bridge Development Module Future Technology Devices International Ltd. The UMFT4222EV is a development module which uses FTDI’s FT4222H…

rcore day6

批处理系统 (Batch System) 出现于计算资源匮乏的年代&#xff0c;其核心思想是&#xff1a; 将多个程序打包到一起输入计算机&#xff1b;当一个程序运行结束后&#xff0c;计算机会 自动 执行下一个程序 应用程序难免会出错&#xff0c;如果一个程序的错误导致整个操作系统都…

Linux系统学习Day2——在Linux系统中开发OpenCV

一、OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的跨平台计算机视觉和机器学习库&#xff0c;广泛应用于图像处理、视频分析、物体检测等领域。它提供了丰富的算法和高效的工具集&#xff0c;支持C、Python等多种语言&#xff0c…

SAP Overview

SAP—企业运营的数字化引擎 在数字化转型的浪潮中&#xff0c;SAP以其全面的企业应用软件套件&#xff0c;为全球企业提供了强大的运营支持。SAP的模块化解决方案覆盖了企业运作的每一个关键环节&#xff0c;从销售到仓库管理&#xff0c;每个模块都是针对特定业务需求精心设计…