亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#實現的BinaryTree

2019-11-17 03:56:01
字體:
來源:轉載
供稿:網友
確切的說,該二叉樹更類似于二叉排序樹,在判斷了節點是否可以進行比較操作后,根據給定的比較操作進行節點的插入。

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产一区二区三区四区| 国产高清在线不卡| 国色天香2019中文字幕在线观看| 亚洲性视频网址| 国产97在线|日韩| 日韩精品在线免费播放| 亚洲人成在线观看网站高清| 高清一区二区三区四区五区| 欧美在线视频一区二区| 色综合伊人色综合网站| 亚洲最大福利视频网| 亚洲第一天堂av| 亚洲男女性事视频| 国产精品久久久精品| 97av在线视频| 精品久久久一区| 久久精品夜夜夜夜夜久久| 2020欧美日韩在线视频| 国产成人亚洲综合91精品| 亚洲a∨日韩av高清在线观看| 欧美体内谢she精2性欧美| 久久久久久久爱| 懂色av影视一区二区三区| 中文字幕免费国产精品| 亚洲第一中文字幕在线观看| 日韩精品www| 欧美激情性做爰免费视频| 国产成人精品久久| 97香蕉超级碰碰久久免费软件| 精品国产自在精品国产浪潮| 久久久精品国产| 国产成人福利视频| 538国产精品一区二区在线| 国产精品va在线播放我和闺蜜| 日本亚洲欧洲色α| 亚洲欧洲在线看| 国产成人高清激情视频在线观看| 亚洲缚视频在线观看| 亚洲欧洲一区二区三区久久| 亚洲美女在线观看| 久久久久久久久久久免费精品| 欧美黑人巨大xxx极品| 亚洲天堂日韩电影| 国产综合久久久久| 色多多国产成人永久免费网站| 在线观看国产成人av片| 日韩国产中文字幕| 国产精品视频色| 日韩av电影在线免费播放| 国产一区二区三区直播精品电影| 亚洲人成在线电影| 欧美片一区二区三区| 精品国产乱码久久久久酒店| 国产精品日韩专区| 成人天堂噜噜噜| 亚洲欧美日韩在线一区| 久久精品青青大伊人av| 亚洲人成在线电影| 亚洲xxx大片| 欧美成年人视频网站| 亚洲欧美另类中文字幕| 欧美美最猛性xxxxxx| 日韩日本欧美亚洲| 亚洲欧美一区二区三区四区| 久久久亚洲网站| 亚洲人午夜精品免费| 欧美性猛交xxxx黑人猛交| 国产精品高潮呻吟久久av无限| 亚洲精品动漫久久久久| 国产精品福利网站| 欧美性极品xxxx做受| 欧美精品激情视频| 日韩av大片免费看| 91免费看片网站| 欧美性受xxxx黑人猛交| 亚洲精品成人久久电影| 国产乱人伦真实精品视频| 欧美日韩性生活视频| 国产精品成人va在线观看| 欧美性生交大片免网| 日韩一二三在线视频播| 欧美成人免费全部观看天天性色| 日韩在线高清视频| 午夜精品福利在线观看| 欧美精品videofree1080p| 青草成人免费视频| 欧美国产日韩一区二区三区| 精品国内亚洲在观看18黄| 国产精品成人免费视频| 性色av一区二区三区红粉影视| 国产激情视频一区| 亚洲精品suv精品一区二区| 一区二区三区国产在线观看| 日韩电视剧在线观看免费网站| 亚洲在线观看视频| 91系列在线观看| 欧美日韩裸体免费视频| 欧美大全免费观看电视剧大泉洋| 久久91精品国产91久久跳| 国产精品久久久久久久电影| 日韩在线视频网| 亚洲国产婷婷香蕉久久久久久| 国产精品999999| 欧美日韩激情视频| 亚洲免费电影一区| 91豆花精品一区| 亚洲一区中文字幕| 久久久伊人日本| 国产成人精品视频在线| 色中色综合影院手机版在线观看| 日韩精品视频免费在线观看| 久久婷婷国产麻豆91天堂| 久久在线视频在线| 自拍偷拍免费精品| 日韩国产激情在线| 国产精品欧美一区二区三区奶水| 欧美成人免费全部观看天天性色| 9.1国产丝袜在线观看| 欧美精品一本久久男人的天堂| 欧美成人三级视频网站| 91精品国产高清自在线| 欧美猛男性生活免费| 亚洲iv一区二区三区| 亚洲一区二区三区视频播放| 亚洲国产一区二区三区四区| 亚洲国产精品美女| 在线观看欧美日韩国产| 欧美日韩中文字幕综合视频| 日韩欧美aⅴ综合网站发布| 在线观看日韩av| 国产成人精品免费久久久久| 久久99精品久久久久久青青91| 91久热免费在线视频| 97国产在线观看| 国产欧美日韩中文| 欧美亚洲伦理www| 欧美黄色免费网站| 欧美日在线观看| 久久国产精品99国产精| 国产成+人+综合+亚洲欧美丁香花| 国产精品日韩久久久久| 久久男人资源视频| 日韩精品高清在线观看| 亚洲乱亚洲乱妇无码| 伊人亚洲福利一区二区三区| 精品国产1区2区| 国产精品视频1区| 亚洲黄页网在线观看| 亚洲精品国产精品久久清纯直播| 久久91亚洲人成电影网站| 亚洲自拍另类欧美丝袜| 97在线免费观看视频| 日韩男女性生活视频| 欧美自拍视频在线观看| 久久人人97超碰精品888| 91在线精品播放| 亚洲色图国产精品| 欧美日产国产成人免费图片| 欧美日韩亚洲成人| 欧美乱大交xxxxx另类电影| 亚洲国产成人精品女人久久久| 久久精品一本久久99精品| 久久久久久久久久久成人| 欧美日韩在线视频一区|