#region binaryTree public class BinaryNode<T> : IComparable<BinaryNode<T>>where T : IComparable<T> { T data; /// <summary> /// 这里是因为ref 只能加在字段上, /// 所以要在程序集内公开访问 /// </summary> internal BinaryNode<T> _lnode; internal BinaryNode<T> _rnode; internal BinaryNode<T> _pnode; public T Data { set { data = value; } get { return data; } } public int CompareTo(BinaryNode<T> other) { return this.data.CompareTo(other.data); } /// <summary> /// 当前节点是否是叶节点 /// </summary> public bool IsLeaf { get { return this!=null && this.LNode == null && this.RNode == null; } } /// <summary> /// 爷节点 /// </summary> public BinaryNode<T> GrandParent { get { return this.PNode.PNode; } } /// <summary> /// 当前节点的叔父节点 /// </summary> public BinaryNode<T> UncleNode { get { if (GrandParent.LNode == this.PNode) return GrandParent.RNode; else return GrandParent.LNode; } } /// <summary> /// 当前节点的兄弟节点 /// </summary> public BinaryNode<T> SiblingNode { get { if (PNode.LNode == this) return PNode.RNode; else return PNode.LNode; } } /* A A / / B C是A的内侧子孙 B / / C C */ /// <summary> /// 当前节点是爷节点的内侧子孙 /// </summary> public bool IsInSide { get { if (this.PNode != null && GrandParent != null) { if ((this.PNode.IsLeftChild && this.IsRightChild) || (this.PNode.IsRightChild && this.IsLeftChild)) return true; } return false; } } /* A A / / B C是A的外侧子孙 B / / C C */ /// <summary> /// 当前节点是爷节点的外侧子孙 /// </summary> public bool IsOutSide { get { if (this.PNode != null && GrandParent != null) { return !this.IsInSide; } return false; } } /// <summary> /// 当前节点是父节点的转孩子 /// </summary> public bool IsLeftChild { get { if (this.PNode != null) { return this.PNode.LNode != null && this.PNode.LNode == this; } return false; } } /// <summary> /// 当前节点是父节点的转孩子 /// </summary> public bool IsRightChild { get { if (this.PNode != null) { return this.PNode.RNode != null && this.PNode.RNode == this; } return false; } } public BinaryNode<T> LNode { set { _lnode = value; if (value != null) value.PNode = this; } get { return _lnode; } } public BinaryNode<T> RNode { set { _rnode = value; if (value != null) value.PNode = this; } get { return _rnode; } } public BinaryNode<T> PNode { set { _pnode = value; } get { return _pnode; } } public BinaryNode(){ } public BinaryNode(T data) { this.data = data; } } public abstract class BinaryTree<T> where T : IComparable<T> { protected BinaryNode<T> _root; public BinaryTree(T rootData) { _root = new BinaryNode<T>(rootData); } public BinaryTree(){} /// <summary> /// 横向打印 /// </summary> /// <returns></returns> /// //root level1 level2 // 98 // 45 // 49 // 45 // 32 // 23 // 32 public string Print() { StringBuilder builder = new StringBuilder(); if (_root != null) { PrintTree(builder,1,_root); } return builder.ToString(); } private void PrintTree(StringBuilder builder, int level, BinaryNode<T> node) { if (node != null) { if (node.RNode != null) PrintTree(builder,level+1,node.RNode); PrintData(builder, level, node); if (node.LNode != null) PrintTree(builder, level + 1, node.LNode); } } protected virtual string NodePrintSpace { get { return " "; } } private void PrintData(StringBuilder builder,int level,BinaryNode<T> node) { if (_root != null) { for (int i = 0; i < level; i++) { builder.Append(NodePrintSpace); } AddPrintData(builder,node); builder.Append("/n"); } } protected virtual void AddPrintData(StringBuilder builder,BinaryNode<T> node) { builder.Append(node.Data.ToString()); } public void Clear() { this._root = null; } } #endregion #region BSTree /*********************************************************************************** * 二叉排序树(BSTree)算法实现 * Date:2008.12.25 * Author:Yabin * *********************************************************************************/ /// <summary> /// 二叉排序树操作接口 /// </summary> /// interface IBSTree<T> where T : IComparable<T> { bool InsertNode(T data); void Insert(T[] dataArr); bool RemoveNode(T data); BinaryNode<T> FindNode(T data); string Print(); void Clear(); } public class BSTree<T> : BinaryTree<T>, IBSTree<T> where T : IComparable<T> { public BSTree(T data) : base(data) { } public BSTree() { } /// <summary> /// FindData节点遍历时的空节点或匹配节点的的父指针 /// </summary> protected BinaryNode<T> Current; /// <summary> /// 内部插入节点 /// </summary> /// <param name="newNode"></param> /// <returns></returns> protected virtual bool InsertNode(BinaryNode<T> newNode) { if (_root == null) { _root = newNode; return true; } Current = null; BinaryNode<T> temp = _root; while (true) { int iResult = newNode.Data.CompareTo(temp.Data); if (iResult == 0) return false; if (iResult < 0) { if (temp.LNode != null) temp = temp.LNode; else { Current = temp; temp.LNode = newNode; break; } } else if (iResult > 0) { if (temp.RNode != null) temp = temp.RNode; else { Current = temp; temp.RNode = newNode; break; } } } return true; } /// <summary> /// 插入为虚函数,子类可以override来插入自己的节点类型 /// </summary> /// <param name="data"></param> /// <returns></returns> public virtual bool InsertNode(T data) { return InsertNode(new BinaryNode<T>(data)); } /// <summary> /// 批量插入节点 /// </summary> /// <param name="datas"></param> public void Insert(T[] datas) { foreach (T temp in datas) InsertNode(temp); } public BinaryNode<T> FindNode(T data) { BinaryNode<T> temp = _root; Current = null; while (temp!=null) { int iResult = data.CompareTo(temp.Data); if (iResult== 0) return temp; if (temp.LNode != null && iResult < 0) { Current = temp; temp = temp.LNode; } else if (temp.RNode != null && iResult > 0) { Current = temp; temp = temp.RNode; } else break; } return null; } protected bool Internel_RemoveNode(BinaryNode<T> node) { BinaryNode<T> pNode = node.PNode; if (pNode != null) { if (pNode.LNode == node) return RemoveNode(ref pNode._lnode); else return RemoveNode(ref pNode._rnode); } else return RemoveNode(ref _root); } public virtual bool RemoveNode(T data) { //传入finded节点的父节点的左或右指针的地址 BinaryNode<T> fNode= FindNode(data); if (fNode != null) { ////当finded的节点是根节点 //if(Current==null) // return RemoveNode(ref _root); //if(Current.LNode.Data.CompareTo(data)==0) // return RemoveNode(ref Current._lnode); //else if (Current.RNode.Data.CompareTo(data)==0) // return RemoveNode(ref Current._rnode); return Internel_RemoveNode(fNode); } return false; } protected bool RemoveNode(ref BinaryNode<T> node) { if (node == null) return false; BinaryNode<T> temp = node; //note:左右都为空也通过 if (node.LNode == null || node.RNode == null) { if (null == node.LNode) node = node.RNode; else node = node.LNode; //如果node为根节点,则Current为空 if (node != null) node.PNode = Current; return true; } temp = temp.RNode; while (temp.LNode!=null) temp = temp.LNode; node.Data = temp.Data; Current = temp.PNode; //if (Current._lnode == temp) // return RemoveNode(ref Current._lnode); //else if (Current._rnode == temp) // return RemoveNode(ref Current._rnode); return Internel_RemoveNode(temp); } } #endregion