C#遞歸樹實(shí)現(xiàn)實(shí)例簡析
C#遞歸樹實(shí)現(xiàn)實(shí)例是如何辦到的呢?這里我們使用遞歸來實(shí)現(xiàn)對于數(shù)據(jù)的樹形結(jié)構(gòu)的呈現(xiàn),那么關(guān)于遞歸的方向我們向你介紹兩個,一個是從父節(jié)點(diǎn)出發(fā),一個是反向的實(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á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ù)庫淺析