重新整理数据结构与算法(c#)—— 二叉树排序树[二十二]
前言
什么是二叉堆排序呢?

就是上面这种,一个节点大于左节点,但是小于右节点,再我写的例子中会写出大于等于右节点。
那么如何让一个数组进行变成这种二叉树呢?
其实只要有规律就很简单。
第一个元素(0)作为根节点。
第二个元素如果比第一个元素则判断是否有左节点,如果没有左节点,就是它的左节点,如果有左节点就和它的左节点比较。
正文
直接上代码吧:
public class BinarySortTree
{
//根节点
Node root;
public BinarySortTree(Node root)
{
this.root = root;
}
public BinarySortTree() : this(null)
{
}
public void add(Node node)
{
if (root == null)
{
root = node;
}
else
{
this.root.addNode(node);
}
}
public void infixOrder()
{
if (root == null)
{
Console.WriteLine("root 为空");
}
else
{
root.infixOrder();
}
}
public Node searchNode(int value)
{
if (root==null)
{
Console.WriteLine("root 为空");
}
return root.searchNode(value);
}
}
public class Node
{
public Node left;
public Node right;
int value;
public int Value { get => value; set => this.value = value; }
public Node(int value)
{
this.Value = value;
}
//中序排序
public void infixOrder()
{
if (this.left != null)
{
this.left.infixOrder();
}
Console.WriteLine(this);
if (this.right != null)
{
this.right.infixOrder();
}
}
public override string ToString()
{
return Value.ToString();
}
//增加元素
public void addNode(Node node)
{
if (node.Value < this.Value)
{
if (this.left == null)
{
this.left = node;
}
else
{
this.left.addNode(node);
}
}
else {
if (this.right == null)
{
this.right = node;
}else {
this.right.addNode(node);
}
}
}
//查找元素
public Node searchNode(int value)
{
if (this.Value == value)
{
return this;
}
if (this.Value > value)
{
if (this.left != null)
{
return this.right.searchNode(value);
}
else
{
return null;
}
}
else
{
if (this.left != null)
{
return this.left.searchNode(value);
}
else
{
return null;
}
}
}
}
测试代码:
static void Main(string[] args)
{
int[] arr = { 7, 3, 10, 12, 5, 1, 9, 2 };
BinarySortTree binarySortTree = new BinarySortTree();
//循环的添加结点到二叉排序树
for (int i = 0; i < arr.Length; i++)
{
binarySortTree.add(new Node(arr[i]));
}
//中序遍历后的数据
binarySortTree.infixOrder();
Node node = binarySortTree.searchNode(7);
Console.WriteLine("输入7,查找结果为:"+node.Value);
//查找一个为空元素
Node node100 = binarySortTree.searchNode(100);
if (node100 == null)
{
Console.WriteLine("查找元素为空");
}
Console.Read();
}
测试结果:

后面补一下删除节点的,看下以前的丢了不。
重新整理数据结构与算法(c#)—— 二叉树排序树[二十二]的更多相关文章
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)
前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...
- Java数据结构和算法(一)树
Java数据结构和算法(一)树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 前面讲到的链表.栈和队列都是一对一的线性结构, ...
- 剑指Offer(二十二):从上往下打印二叉树
剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- Java数据结构和算法(六)--二叉树
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...
- 数据结构与算法之--高级排序:shell排序和快速排序
高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...
- Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序
三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...
- 数据结构与算法之PHP排序算法(堆排序)
一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...
- 数据结构与算法之PHP排序算法(希尔排序)
一.基本思想 希尔排序算法是希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接 ...
随机推荐
- Java 交换两个变量的值
1 //交换两个变量的值 2 // 1 3 int nu1 = 10; 4 int nu2 = 20; 5 6 System.out.println("nu1 = "+nu1+&q ...
- Server-side template injection 模板注入问题总结
概念: 服务器模板注入(Server-side template injection) 攻击者能够使用本地的模板语法去注入一个恶意的payload,然后在服务器端执行该攻击,当与欧股直接输入数据到模板 ...
- pdfz Vue-3-Cheat-Sheet-zh 官方要是能下载下来,我也就不放这里了。 VUE3 composition API cheat sheet
https://files.cnblogs.com/files/pengchenggang/Vue-3-Cheat-Sheet-zh.zip 官方下载地址:https://www.vuemastery ...
- printJS 打印 无头无尾 style 加 @page { margin: 0; } body { padding: 100px;}
// 使用npm模块 print-js printJS({ printable: this.printData, type: 'json', documentTitle: ' ', propertie ...
- Github下载release附件变相提速方法
最近找到了个油猴插件,下载2M/s,推荐大家使用Github 镜像访问,加速下载 描述 github上面有许多开源的软件,作者们都打包发布为release版本,我们可以下载打包好的软件,但是,由于国内 ...
- auto推导类型注意
auto推导类型忽略顶层const,不忽略底层const. 顶层const:指针或引用本身是const不可变,也就是指针指向的内存地址不可变,但指向的内存内容可变. 底层const:指针指向的内存地址 ...
- C++ explicit 关键字简介
explicit 关键字修饰构造函数 防止类的初始化的时候进行隐式转换. class MyClass { string m_s; int m_a, m_b; public: MyClass(strin ...
- 从null-ls归档再看nvim的代码格式化与lint方案
由于null-lsp的归档和暂停更新,我们需要重新审视并思考还有哪些架构简单易于理解的插件配置方案.本文将介绍脱离null-ls插件体系下的代码格式化和lint的插件配置方案. 在之前的文章中< ...
- 3DCAT将携Cloud3D/XR解决方案亮相视博会
2021年05月10日-12日,亚洲视觉智能与沉浸式产业博览会将在广州·中国进出口商品交易会展展馆隆重开幕!届时,3DCAT实时渲染云将携Cloud3D.CloudXR解决方案惊艳亮相,4.2号展馆H ...
- python基础六(函数基础及参数使用)
一. 函数定义 1.什么是函数 函数就相当于具备某一功能的工具 函数的使用必须遵循一个原则: 先定义 后调用2.为何要用函数 代码冗余,程序的组织结构不清晰,可读性差 可维护性.扩展性差3.如何用函数 ...