溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中怎么實(shí)現(xiàn)一個(gè)遞歸樹

發(fā)布時(shí)間:2021-07-08 15:03:36 來源:億速云 閱讀:703 作者:Leah 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)C#中怎么實(shí)現(xiàn)一個(gè)遞歸樹,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

C#遞歸樹實(shí)現(xiàn)實(shí)例:從父結(jié)點(diǎn)加字節(jié)點(diǎn),注釋的是把字節(jié)點(diǎn)向父結(jié)點(diǎn)上加

//將數(shù)據(jù)填充到dataTable  DataTable mytable = new DataTable();  //構(gòu)建表結(jié)構(gòu)  DataRow myRow;  DataColumn Id = new DataColumn("Id", typeof(System.Int32));  mytable.Columns.Add(Id);  DataColumn Name = new DataColumn("Name", typeof(System.String));  mytable.Columns.Add(Name);  DataColumn ParentId = new DataColumn("ParentId", typeof(System.Int32));  mytable.Columns.Add(ParentId);  DataColumn SiteInfo = new DataColumn("SiteInfo", typeof(SiteInfo));  mytable.Columns.Add(SiteInfo);  //填充數(shù)據(jù)  //注意i是從1開始的,因?yàn)閿?shù)據(jù)庫(kù)收條沒有意義,  //數(shù)據(jù)庫(kù)首條記錄id為0,會(huì)引起死循環(huán)  for (int i = 1; i <= cata.Length - 1; i++)  {   myRow = mytable.NewRow();   myRow["Id"] = cata[i].Id;   myRow["Name"] = cata[i].Name;   myRow["ParentId"] = cata[i].ParentId;   myRow["SiteInfo"] = cata[i].SiteInfo;    mytable.Rows.Add(myRow);  }    this.InitTree(newNode.ChildNodes, 0, mytable);       //Hashtable ht = new Hashtable();   //for (int i = 1; i < cata.Length; i++)  //{  // ht.Add(cata[i].Id, cata[i]);  //}    //Hashtable allTreeNodes = new Hashtable();  //Hashtable parentNodes = new Hashtable();  ////遍歷樹節(jié)點(diǎn)描述并擬向生成樹結(jié)構(gòu)  //foreach (DictionaryEntry dict in ht)  //{  // CatalogInfo treeobj = (CatalogInfo)dict.Value;  // if (allTreeNodes.Contains(treeobj.Id))  //  continue;  // TreeNode tn = new TreeNode();  // tn.Text = treeobj.Name;  // tn.Value = treeobj.Id.ToString();  // tn.NavigateUrl = "main_right.aspx?catalogid=" + tn.Value;  // tn.Target = "WorkArea";  // generateParentTreeFromNode(  tn, (CatalogInfo)treeobj, ht, parentNodes, allTreeNodes);  //}   ////將所有根節(jié)點(diǎn)放到treeview上  //foreach (DictionaryEntry dict in parentNodes)  //{  // newNode.ChildNodes.Add((TreeNode)dict.Value);  //}    }  }   private void InitTree(TreeNodeCollection Nds,   int parentID, DataTable dt)//遞歸初始化樹   {    TreeNode tmpNd;    //遞歸尋找子節(jié)點(diǎn)    DataRow[] rows = dt.Select("ParentID=" + parentID);    foreach (DataRow row in rows)    {  tmpNd = new TreeNode();  tmpNd.Value = row["Id"].ToString();  tmpNd.Text = row["Name"].ToString();  tmpNd.NavigateUrl = "main_right.aspx?catalogid=" + row["Id"].ToString() + "&catalogName=  " +Server.UrlEncode(row["Name"].ToString());  tmpNd.Target = "WorkArea";  Nds.Add(tmpNd);   InitTree(tmpNd.ChildNodes, Convert.ToInt32(tmpNd.Value), dt);    }   }

C#遞歸樹實(shí)現(xiàn)實(shí)例:從子節(jié)點(diǎn)出發(fā)考慮

/// <summary>  /// 反向樹生成算法  /// </summary>  /// <param name="subtr">子節(jié)點(diǎn)</param>  /// <param name="subto">子節(jié)點(diǎn)描述對(duì)象</param>  /// <param name="hashedTreeObject">被保存到哈希表中的子節(jié)點(diǎn)描述</param>  /// <param name="hashedParents">被保存到哈希表中的父節(jié)點(diǎn)描述</param>  /// <param name="allTreeNodes">被保存到哈希表中的所有節(jié)點(diǎn)描述</param>  private void generateParentTreeFromNode(  TreeNode subtr, CatalogInfo subto, Hashtable hashedTreeObject,   Hashtable hashedParents, Hashtable allTreeNodes)  {    TreeNode trParent;   if (null == hashedTreeObject)    return;   //確定父結(jié)點(diǎn)是否存在   if (!hashedTreeObject.Contains(  subto.ParentId) || subto.ParentId == subto.Id )   {    //不存在則將當(dāng)前節(jié)點(diǎn)作為根    if (hashedParents == null)  hashedParents = new Hashtable();    if (!hashedParents.Contains(subto.ParentId))    {  hashedParents.Add(subto.Id, subtr);  if (!allTreeNodes.Contains(subto.Id))   allTreeNodes.Add(subto.Id, subtr);  trParent = subtr;    }   }   else  {    //若存在,則獲取父結(jié)點(diǎn)    CatalogInfo to = (CatalogInfo)hashedTreeObject[subto.ParentId];    //判斷父結(jié)點(diǎn)是否已經(jīng)被保存到樹節(jié)點(diǎn)的哈希表中    if (allTreeNodes.Contains(subto.ParentId))    {  //if (allTreeNodes.Contains(subto.Id))  // return;  trParent = (TreeNode)allTreeNodes[subto.ParentId];  trParent.ChildNodes.Add(subtr);    }    else   {  //父結(jié)點(diǎn)不存在于哈希表中,創(chuàng)建父結(jié)點(diǎn)并存放到葉子哈希表中  trParent = new TreeNode();  trParent.Text = to.Name;  trParent.Value = to.Id.ToString();  allTreeNodes.Add(subto.ParentId, trParent);  trParent.ChildNodes.Add(subtr);  //遞歸向上查找  generateParentTreeFromNode(trParent, to,   hashedTreeObject, hashedParents, allTreeNodes);  if (!allTreeNodes.Contains(subto.Id))   allTreeNodes.Add(subto.Id, subtr);    }    }  }

上述就是小編為大家分享的C#中怎么實(shí)現(xiàn)一個(gè)遞歸樹了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI