C#遞歸樹實(shí)現(xiàn)實(shí)例簡析
C#遞歸樹實(shí)現(xiàn)實(shí)例是如何辦到的呢?這里我們使用遞歸來實(shí)現(xiàn)對于數(shù)據(jù)的樹形結(jié)構(gòu)的呈現(xiàn),那么關(guān)于遞歸的方向我們向你介紹兩個(gè),一個(gè)是從父節(jié)點(diǎn)出發(fā),一個(gè)是反向的實(shí)現(xiàn),讓我們看看具體的實(shí)現(xiàn)步驟吧:
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ù)庫收條沒有意義,
 - //數(shù)據(jù)庫首條記錄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)描述對象</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)實(shí)例的基本內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習(xí)C#遞歸樹的實(shí)現(xiàn)有所幫助。
【編輯推薦】
- C#遞歸算法理解的實(shí)例分析
 - C#遞歸思路的使用實(shí)例詳解
 - C#遞歸函數(shù)應(yīng)用實(shí)例解析
 - DropDownList顯示的C#遞歸實(shí)現(xiàn)淺析
 - C#treeview遞歸操作數(shù)據(jù)庫淺析
 















 
 
 
 
 
 
 