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

C#二叉搜索树算法

二叉搜索树算法实现原理

二叉搜索树(Binary Search Tree,简称BST)是一种节点有序排列的二叉树数据结构。它具有以下性质:

  • 每个节点最多有两个子节点。

  • 对于每个节点,其左子树的所有节点值都小于该节点值,其右子树的所有节点值都大于该节点值。

实现基本步骤和代码示例

步骤

  • 定义节点类:包含节点值、左子节点和右子节点。

  • 插入节点:递归或迭代地将新值插入到树中合适的位置。

  • 搜索节点:根据节点值在树中查找特定值。

  • 删除节点:从树中删除特定值的节点,并维护树的结构。

  • 遍历树:包括前序遍历、中序遍历、后序遍历和层次遍历等。

完整代码示例

namespace HelloDotNetGuide.常见算法
{public class 二叉搜索树算法{public static void BinarySearchTreeRun(){var bst = new BinarySearchTree();// 插入一些值到树中bst.Insert(50);bst.Insert(30);bst.Insert(20);bst.Insert(40);bst.Insert(70);bst.Insert(60);bst.Insert(80);bst.Insert(750);Console.WriteLine("中序遍历(打印有序数组):");bst.InorderTraversal();Console.WriteLine("\n");// 查找某些值Console.WriteLine("Search for 40: " + bst.Search(40)); // 输出: TrueConsole.WriteLine("Search for 25: " + bst.Search(25)); // 输出: FalseConsole.WriteLine("\n");// 删除某个值bst.Delete(50);Console.WriteLine("删除50后:");bst.InorderTraversal();}}/// <summary>/// 定义二叉搜索树的节点结构/// </summary>public class TreeNode{public int Value;public TreeNode Left;public TreeNode Right;public TreeNode(int value){Value = value;Left = null;Right = null;}}/// <summary>/// 定义二叉搜索树类/// </summary>public class BinarySearchTree{private TreeNode root;public BinarySearchTree(){root = null;}#region 插入节点/// <summary>/// 插入新值到二叉搜索树中/// </summary>/// <param name="value">value</param>public void Insert(int value){if (root == null){root = new TreeNode(value);}else{InsertRec(root, value);}}private void InsertRec(TreeNode node, int value){if (value < node.Value){if (node.Left == null){node.Left = new TreeNode(value);}else{InsertRec(node.Left, value);}}else if (value > node.Value){if (node.Right == null){node.Right = new TreeNode(value);}else{InsertRec(node.Right, value);}}else{//值已经存在于树中,不再插入return;}}#endregion#region 查找节点/// <summary>/// 查找某个值是否存在于二叉搜索树中/// </summary>/// <param name="value">value</param>/// <returns></returns>public bool Search(int value){return SearchRec(root, value);}private bool SearchRec(TreeNode node, int value){// 如果当前节点为空,表示未找到目标值if (node == null){return false;}// 如果找到目标值,返回trueif (node.Value == value){return true;}// 递归查找左子树或右子树if (value < node.Value){return SearchRec(node.Left, value);}else{return SearchRec(node.Right, value);}}#endregion#region 中序遍历/// <summary>/// 中序遍历(打印有序数组)/// </summary>public void InorderTraversal(){InorderTraversalRec(root);}private void InorderTraversalRec(TreeNode root){if (root != null){InorderTraversalRec(root.Left);Console.WriteLine(root.Value);InorderTraversalRec(root.Right);}}#endregion#region 删除节点/// <summary>/// 删除某个值/// </summary>/// <param name="val">val</param>public void Delete(int val){root = DeleteNode(root, val);}private TreeNode DeleteNode(TreeNode node, int val){if (node == null){return null;}if (val < node.Value){node.Left = DeleteNode(node.Left, val);}else if (val > node.Value){node.Right = DeleteNode(node.Right, val);}else{// 节点有两个子节点if (node.Left != null && node.Right != null){// 使用右子树中的最小节点替换当前节点TreeNode minNode = FindMin(node.Right);node.Value = minNode.Value;node.Right = DeleteNode(node.Right, minNode.Value);}// 节点有一个子节点或没有子节点else{TreeNode? temp = node.Left != null ? node.Left : node.Right;node = temp;}}return node;}/// <summary>/// 找到树中的最小节点/// </summary>/// <param name="node"></param>/// <returns></returns>private TreeNode FindMin(TreeNode node){while (node.Left != null){node = node.Left;}return node;}#endregion}
}

输出结果:

图片

数组与搜索树的效率对比

二叉搜索树的各项操作的时间复杂度都是对数阶,具有稳定且高效的性能。只有在高频添加、低频查找删除数据的场景下,数组比二叉搜索树的效率更高。

图片

二叉搜索树常见应用

  • 用作系统中的多级索引,实现高效的查找、插入、删除操作。

  • 作为某些搜索算法的底层数据结构。

  • 用于存储数据流,以保持其有序状态。

C#数据结构与算法实战入门指南

  • https://mp.weixin.qq.com/s/XPRmwWmoZa4zq29Kx-u4HA

参考文章

  • https://www.hello-algo.com/chapter_tree/binary_search_tree

  • https://www.hello-algo.com/chapter_tree/binary_tree_traversal

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库查询优化:提高数据提取效率
  • 趋势分享|Gartner解读中国企业容器管理新挑战:混合环境、容器安全、AI支持
  • 网络缓存:加速网络应用的隐形引擎
  • 如何在 Ubuntu 系统中安装PyCharm集成开发环境?
  • Java—Arrays api
  • P2730 [USACO3.2] 魔板 Magic Squares
  • 今日总结:巧用setTimeout()方法来制造局部刷新效果
  • MySQL学习笔记之用户管理与权限控制(DCL)
  • Android常见界面控件(三)
  • 云计算第二阶段---DBA Day05-DAY07
  • 解决方案:在jupyter notebook环境下安装不了numpy
  • 最近(2024.08.14-2024.08.25 )面试感悟
  • 软件测试之黑盒测试详解
  • Github 2024-08-22 Go开源项目日报 Top10
  • 全排列-深度优先搜索
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • avalon2.2的VM生成过程
  • CentOS 7 防火墙操作
  • dva中组件的懒加载
  • Java面向对象及其三大特征
  • js ES6 求数组的交集,并集,还有差集
  • ng6--错误信息小结(持续更新)
  • Nodejs和JavaWeb协助开发
  • PHP CLI应用的调试原理
  • Python_网络编程
  • REST架构的思考
  • Solarized Scheme
  • Spring声明式事务管理之一:五大属性分析
  • ucore操作系统实验笔记 - 重新理解中断
  • vue.js框架原理浅析
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 技术胖1-4季视频复习— (看视频笔记)
  • 解析带emoji和链接的聊天系统消息
  • 坑!为什么View.startAnimation不起作用?
  • 我这样减少了26.5M Java内存!
  • 协程
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​如何防止网络攻击?
  • #《AI中文版》V3 第 1 章 概述
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (16)Reactor的测试——响应式Spring的道法术器
  • (39)STM32——FLASH闪存
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (pytorch进阶之路)扩散概率模型
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)jdk与jre的区别
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .java 9 找不到符号_java找不到符号