分享
 
 
 

C#实现的BinaryTree

王朝学院·作者佚名  2009-12-24
窄屏简体版  字體: |||超大  

确切的说,该二叉树更类似于二叉排序树,在判断了节点是否可以进行比较操作后,根据给定的比较操作进行节点的插入。

using System;

using System.Collections;

namespace SEI.DL88250.SourceCodes.BinaryTree

{

/// <summary> 二叉树节点类 </summary>

class TreeNode

{

/// <summary> 当前节点的出现计数 </summary>

private int _occurs;

/// <summary> 当前节点值 </summary>

private object _nval;

/// <summary> 左孩子节点 </summary>

private TreeNode _lchild;

/// <summary> 右孩子节点 </summary>

private TreeNode _rchild;

/// <value> 设置/返回右孩子节点 </value>

/// <remarks> 设置/返回

/// <see cref="_rchild"/> 字段

/// </remarks>

public TreeNode RightChild

{

get { return _rchild; }

set { _rchild = (TreeNode)value; }

}

/// <value> 设置/返回左孩子节点 </value>

/// <remarks> 设置返回

/// <see cref="_lchild"/> 字段

/// </remarks>

public TreeNode LeftChild

{

get { return _lchild; }

set { _lchild = (TreeNode)value; }

}

/// <value> 返回当前节点值 </value>

/// <remarks> 返回

/// <see cref="_nval"/> 字段

/// </remarks>

public object Value { get { return _nval; } }

/// <summary> 构造一个二叉树节点 </summary>

/// <param name="val"> 节点对象 </param>

public TreeNode( object val)

{

_nval = val;

_occurs = 1 ;

_rchild = _lchild = null ;

}

/// <summary> 在二叉树中查找指定对象 </summary>

/// <param name="val"> 待查对象 </param>

/// <remarks> 用尾递归方式进行查找 </remarks>

/// <returns>

/// <list>

/// <item> null: 说明未找到待查对象 </item>

/// <item> this: 待查对象 </item>

/// <item> _lchild.FindValue(val): 左子树递归查找 </item>

/// <item> _rchild.FindValue(val): 右子树递归查找 </item>

/// </list>

/// </returns>

public TreeNode FindValue( object val)

{

IComparable ic = val as IComparable;

if ( 0 == ic.CompareTo(_nval))

{ // 找到!

return this ;

}

if (ic.CompareTo(_nval) < 0 )

{ // 到左子树中查找

if ( null == _lchild)

{

return null ;

}

return _lchild.FindValue(val);

}

else // 到右子树中查找

{

if ( null == _rchild)

{

return null ;

}

return _rchild.FindValue(val);

}

}

/// <summary> 插入对象到二叉树中 </summary>

/// <remarks> 用尾递归方式进行插入 </remarks>

/// <param name="val"> 要插入的对象 </param>

public void InsertValue( object val)

{

IComparable ic = val as IComparable;

if ( 0 == ic.CompareTo(_nval))

{

_occurs ++ ;

return ;

}

if (ic.CompareTo(_nval) < 0 )

{ // 插入到左子树

if ( null == _lchild)

{

_lchild = new TreeNode(val);

}

else

{

_lchild.InsertValue(val);

}

}

else

{ // 插入到右子树

if ( null == _rchild)

{

_rchild = new TreeNode(val);

}

else

{

_rchild.InsertValue(val);

}

}

}

/// <summary> 设置左子树叶子节点为指定对象值 </summary>

/// <remarks> 这个方法主要用于删除节点的操作 </remarks>

/// <param name="leaf"> 要设置的节点值 </param>

/// <param name="subtree"> 左子树根节点 </param>

public static void LchildLeaf(TreeNode leaf, TreeNode subtree)

{

while (subtree._lchild != null )

{

subtree = subtree._lchild;

}

subtree._lchild = leaf;

}

/// <summary> 删除指定对象 </summary>

/// <remarks> 用尾部递归方式删除 </remarks>

/// <param name="val"> 要删除的对象 </param>

/// <param name="prev"> 要删除节点的前一个节点 </param>

/// <returns>

/// <list>

/// <item> false: 说明未找到待删除对象 </item>

/// <item> _lchild.RemoveValue(val, ref _lchild): 左子树递归删除 </item>

/// <item> _rchild.RemoveValue(val, ref _rchild): 右子树递归删除 </item>

/// </list>

/// </returns>

public bool RemoveValue( object val, ref TreeNode prev)

{

IComparable ic = val as IComparable;

if ( 0 == ic.CompareTo(_nval))

{

if (_rchild != null )

{

prev = _rchild;

if (_lchild != null )

{

if ( null == prev._lchild)

{

prev._lchild = _lchild;

}

else

{

LchildLeaf(_lchild, prev._lchild);

}

}

}

else

{

prev = _lchild;

}

}

if (ic.CompareTo(_nval) < 0 )

{

if ( null == _lchild)

{

return false ;

}

return _lchild.RemoveValue(val, ref _lchild);

}

else

{

if ( null == _rchild)

{

return false ;

}

return _rchild.RemoveValue(val, ref _rchild);

}

}

}

}

using System;

namespace SEI.DL88250.SourceCodes.BinaryTree

{

/// <summary> 二叉树类 </summary>

class BinaryTree

{

/// <summary> 节点类型 </summary>

private Type _elemType;

/// <summary> 根节点 </summary>

private TreeNode _root;

// private Action _nodeAction;

// public delegate void Action(ref TreeNode node);

/// <summary> 插入一个节点到二叉树中 </summary>

/// <param name="elem"> 待插入的节点 </param>

public void Insert( object elem)

{

// 判断是否是根节点

if ( null == _root)

{

ConfirmComparable(elem);

_elemType = elem.GetType();

_root = new TreeNode(elem);

}

else // 是叶子节点

{

ConfirmType(elem);

_root.InsertValue(elem);

}

}

/// <summary> 删除根节点 </summary>

/// <returns>

/// <list>

/// <item> false: 说明当前树为空 </item>

/// <item> ture: 删除根节点成功 </item>

/// </list>

/// </returns>

private bool RemoveRoot()

{

if ( null == _root)

{

return false ;

}

TreeNode tmp = _root;

if (_root.RightChild != null )

{

_root = _root.RightChild;

TreeNode lc = tmp.LeftChild;

TreeNode newlc = _root.LeftChild;

if (lc != null )

{

if ( null == newlc)

{

_root.LeftChild = lc;

}

else

{

TreeNode.LchildLeaf(lc, newlc);

}

}

}

else

{

_root = _root.LeftChild;

}

return true ;

}

/// <summary> 删除指定对象的节点 </summary>

/// <param name="elem"> 给定对象 </param>

/// <returns>

/// <list>

/// <item> false: 说明当前树为空 </item>

/// <item> _root.RemoveValue(elem, ref _root): 尾部递归删除节点 </item>

/// </list>

/// </returns>

public bool Remove( object elem)

{

if (_root == null )

{

return false ;

}

IComparable ic = ConfirmComparable(elem);

ConfirmType(elem);

if ( 0 == ic.CompareTo(_root.Value))

{

return RemoveRoot();

}

return _root.RemoveValue(elem, ref _root);

}

/// <summary> 查找与给定对象相同的节点 </summary>

/// <param name="elem"> 给定对象 </param>

/// <returns>

/// <list>

/// <item> null: 说明没有找到 </item>

/// <item> _root.FindValue(elem): 尾部递归查找方法 </item>

/// </list>

/// </returns>

public TreeNode Find( object elem)

{

if ( null == _root)

{

return null ;

}

ConfirmType(elem);

return _root.FindValue(elem);

}

/// <summary> 查看给定对象类型是否与二叉树节点类型相同 </summary>

/// <remarks> 类型不符合的话将抛出异常 </remarks>

/// <param name="elem"> 给定对比的对象 </param>

private void ConfirmType( object elem)

{

if (_elemType != elem.GetType())

{

string msg = " Element's type not match with the root's: "

+ _elemType.ToString();

throw new ArgumentException(msg);

}

}

/// <summary> 查看给定对象类型是否可以进行比较运算 </summary>

/// <remarks> 如果类型不可进行比较运算的话将抛出异常 </remarks>

/// <param name="elem"> 给定对象 </param>

/// <returns>

/// <para> IComparable: IComparable接口 </para>

/// </returns>

private IComparable ConfirmComparable( object elem)

{

IComparable ic = elem as IComparable;

if ( null == ic)

{

string msg = " Element type must support IComparable -- "

+ elem.GetType().Name

+ " does not currently do so! " ;

throw new ArgumentException(msg);

}

return ic;

}

}

}

using System;

namespace SEI.DL88250.SourceCodes.BinaryTree

{

/// <summary> 用于测试二叉树类 </summary>

class TestBinTree

{

public static void Main( string [] arga)

{

BinaryTree bt = new BinaryTree();

bt.Insert( " d " );

bt.Insert( " ab " );

bt.Insert( " a " );

bt.Insert( " e " );

TreeNode tn = bt.Find( " ab " );

Console.Write(tn.Value);

bt.Remove( " ab " );

TreeNode tnn = bt.Find( " ab " );

Console.Write(tnn.Value);

}

}

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dz45693/archive/2009/12/22/5057753.aspx

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有