C#树的实现
ddd
/// <summary>
/// 遍历,线索化等操作的接口
/// </summary>
interface ITravelBinTree
{
void PreOrderTravel();
void InOrderTravel();
void RevOrderTravel();
void Print(IBinNode t);
}
interface IInsertBinTree
{
void Insert(IBinNode node, Position pos);
}
/// <summary>
/// 二叉树节点的抽象定义
/// </summary>
interface IBinNode
{
bool isLeaf();
object Element { get; set; }
IBinNode Left { get; set; }
IBinNode Right { get; set; }
} /// <summary>
/// Normal actualize of bintree
/// </summary>
class BinNodePtr : IBinNode
{
protected object element;
protected IBinNode lchild;
protected IBinNode rchild;
public BinNodePtr(object e, IBinNode left, IBinNode right)
{
element = e;
lchild = left;
rchild = right;
}
public BinNodePtr(object e)
{
element = e;
lchild = rchild = null;
}
public BinNodePtr()
{
element = null;
lchild = rchild = null;
}
public bool isLeaf()
{
if (lchild == null && rchild == null)
return true;
return false;
}
public object Element
{
get { return element; }
set { element = value; }
}
public IBinNode Left
{
get
{
return lchild;
}
set
{
lchild = value;
}
}
public IBinNode Right
{
get
{
return rchild;
}
set
{
rchild = value;
}
}
}
class BinNodeLine : BinNodePtr, IBinNode
{
private Tag ltag, rtag;
public BinNodeLine(object e, IBinNode left, IBinNode right)
: base(e, left, right)
{ ltag = rtag = Tag.LINK; }
public BinNodeLine(object e)
: base(e)
{ ltag = rtag = Tag.LINK; }
public Tag LTag
{
get { return ltag; }
set { ltag = value; }
}
public Tag RTag
{
get { return rtag; }
set { rtag = value; }
}
}
/// <summary>
/// LEFT左子树,RIGHT右子树
/// </summary>
enum Position { LEFT, RIGHT };
/// <summary>
/// LINK指向孩子,THREAD指向后继
/// </summary>
enum Tag { LINK, THREAD };
程序的主要代码
class TravelBinTree : ITravelBinTree, IInsertBinTree
{
const int INIT_TREE_SIZE = 20;
private IBinNode tree;
private BinNodeLine head; //线索化后的头指针
private IBinNode prenode; //指向最近访问过的前驱节点
public TravelBinTree()
{
tree = new BinNodePtr();
}
public TravelBinTree(IBinNode INode)
{
tree = INode;
}
/// <summary>
/// 先序遍历树,用非递归算法实现
/// </summary>
/// <remarks>非递归实现</remarks>
public void PreOrderTravel()
{
IBinNode temptree;
Stack stk = new Stack(INIT_TREE_SIZE);
if (tree == null)
throw (new InvalidOperationException("访问的树为空"));
temptree = tree;
stk.Push(tree);
while (stk.Count != 0)
{
while (temptree != null)
{
Print(temptree);
stk.Push(temptree.Left);
temptree = temptree.Left;
}
stk.Pop(); // 空指针退栈
if (stk.Count != 0)
{
temptree = (IBinNode)stk.Pop();
stk.Push(temptree.Right);
temptree = temptree.Right;
}
}
}
public void InOrderTravel()
{
InOrderTravel(tree);
}
private void InOrderTravel(IBinNode t)
{
if (t == null) return;
InOrderTravel(t.Left);
Print(t);
InOrderTravel(t.Right);
}
public void RevOrderTravel()
{
RevOrderTravel(tree);
}
private void RevOrderTravel(IBinNode t)
{
if (t == null) return;
RevOrderTravel(t.Left);
RevOrderTravel(t.Right);
Print(t);
}
public void Print(IBinNode t)
{
Console.Write(t.Element + ",");
}
public void Insert(IBinNode node, Position pos)
{
if (node == null)
throw (new InvalidOperationException("不能将空节点插入树"));
switch (pos)
{
case Position.LEFT: tree.Left = node; break;
case Position.RIGHT: tree.Right = node; break;
}
}
/// <summary>
/// 按照先序遍历顺序遍历树
/// </summary>
public void TreeBuilder()
{
Stack stk = new Stack(INIT_TREE_SIZE);
stk.Push(tree);
Position pos;
string para;
pos = Position.LEFT;
IBinNode baby, temp;
while (true)
{
para = Console.ReadLine();
if (para == "")
{
if (pos == Position.RIGHT)
{
stk.Pop();
while (stk.Count != 0 && ((IBinNode)stk.Peek()).Right != null)
stk.Pop();
if (stk.Count == 0) break;
}
else
pos = Position.RIGHT;
}
else
{
// if (tree.GetType().Equals(baby) == true)
baby = new BinNodePtr(para);
temp = (IBinNode)stk.Peek();
if (pos == Position.LEFT)
temp.Left = baby;
else
temp.Right = baby;
pos = Position.LEFT;
stk.Push(baby);
}
} }
/// <summary>
/// 中序线索化
/// </summary>
public void InOrderThreading()
{
head = new BinNodeLine("");
head.RTag = Tag.THREAD;
head.Right = head;
if (tree == null) head.Left = head;
else
{
head.Left = tree; prenode = head; }
}
/// <summary>
/// 中序线索化的递归实现
/// </summary>
/// <param name="t"></param>
private void InThreading(IBinNode t)
{
if (t == null)
return;
else
{
InThreading(t.Left);
}
}
}
C#树的实现的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- jquery-treegrid树状表格的使用(.Net平台)
上一篇介绍了DataTable,这一篇在DT的基础之上再使用jquery的一款插件:treegrid,官网地址:http://maxazan.github.io/jquery-treegrid/ 一. ...
随机推荐
- 使用 PyTorch FSDP 微调 Llama 2 70B
引言 通过本文,你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B.在此过程中,我们主要会用到 Hugging Face Transformers.Accelera ...
- K8s 里如何优雅地使用 /dev/shm 实现容器间共享内存
目录 1. 从 docker run 的 --shm-size 参数聊起 2. Linux 里的 /dev/shm 3. Docker 对共享内存的支持 4. K8s 里如何设置 /dev/shm 大 ...
- RISC-V系列单片机快速入门指南
如何获取芯片开发资料 方法一:按型号选择 我们更推荐采用按型号选择的方法,获取所对应型号芯片的开发资料,这能有效降低错误使用资料的风险! 沁恒官网首页的产品中心,点击青稞 RISC-V 通用系列,可跳 ...
- 深入理解 Docker 核心原理:Namespace、Cgroups 和 Rootfs
通过这篇文章你可以了解到 Docker 容器的核心实现原理,包括 Namespace.Cgroups.Rootfs 等三个核心功能. 如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎 ...
- MES喷码机联动:MES实时下发设备生产参数及信息,实现从上层系统控制设备输出
随着工厂数字化的不断转型,设备单机工作已逐渐无法满足工业工厂互联网信息化数字化升级需求,从上层工单拉动设备生产参数的变化以及信息输出已经成为必然趋势. 开发工具:C# WPF 数据库:sqlite3 ...
- MySQL运维实战(1.2)安装部署:使用二进制安装部署
作者:俊达 引言 上一篇我们使用了RPM进行安装部署,这是一种安装快速.简化部署和管理过程.与操作系统提供的包管理工具紧密集成的部署方法.此外,当你需要更高的灵活性和自定义性,并且愿意承担一些额外的手 ...
- 良心国产工具,比Xshell好用还免费!
使用或维护Linux系统的都知道,我们日常对服务器的操作,一般都会借助SSH工具远程登录到服务器之后进行操作.常用的SSH工具有不少,比如:Xshell.Putty.SSH Secure Shell ...
- Kernel Memory 中使用 PaddleSharp OCR
Kernel Memory 中使用 PaddleSharp OCR Kernel Memory 中进行文档处理的时候可以上传图片作为文档,这时候就需要使用到 OCR 技术来识别图片中的文字. 官方默认 ...
- MySQL篇:bug1_navicat添加外键保存后不起作用(消失)
问题 在Nacicat premium中添加外键一保存就消失 用SQL语句也显示创建成功,没有报错,可是在INSERT中又起不到约束作用 解决办法 参考一下资料发现可能是表的类型不支持外键 要在 My ...
- 云图说 | 通过Helm模板快速部署中间件应用
摘要:通过全容器化Helm模板,快速部署中间件应用. 云容器引擎基于Kubernetes Helm标准的模板提供统一的资源管理与调度,高效地实现了模板的快速部署与后期管理,大幅简化了Kubernete ...