程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 用C#實現多叉樹的生成並轉化為extjs(基於js腳本的ajax UI框架)的TreeNode的json數據格式(格式為

用C#實現多叉樹的生成並轉化為extjs(基於js腳本的ajax UI框架)的TreeNode的json數據格式(格式為

編輯:C#入門知識

當時想這個算法的時候,是先想好了extjs的格式轉換方法後才寫的,寫完後也沒有考慮extjs是不是可以直接用{ ‘id’:’’,’pid’:’’,’text’:’’}格式的方式來表示呢?呵呵,如果是的話那就郁悶了~~,不管了。為了使用Extjs實現在客戶端顯示樹形節點,需要獲得節點的孩子節點集合。於是,花了三個小時時間寫出了一個遍歷算法(囧,代碼編寫能力還有待提高啊,有時候這中間的關系搞得我暈頭轉向的,不得不一邊畫圖以便寫代碼~~),由children字段為空的List<TreeNode> 分析並返回一個包含children的根節點樹以便生成json數據。

算法思想如下:
1)當nodelist中還有節點存在時,取出nodeList中的一個節點,並將其從nodeList中移除,進行2)
2)采用深度遍歷算法,每取一個節點,將其壓入堆棧,因為nodelist中不包含根節點,故建立一個root節點,進行3)
3)在循環中判斷當前節點是否為空(即已加入為root節點的children集合),不為空則進行4),否則到exit)。
4)取出棧頂節點。判斷該節點是否有未加入children集合的孩子節點(即在nodeList中能否找到
pid為節點id的節點),有則進行5),否則進行6)
5)將該節點取出,並將其從nodeList中刪除,入棧,繼續查找,返回3)
6)若當前節點沒有孩子結點,到7)
7)此時,判斷堆棧是否為空,若為空(表示此時當前節點所有的子節點已找完),到8),若棧不為空,到9)
8)當前節點為葉子節點,棧頂節點即為當前節點的父節點。出棧,將子節點加入到父節點的children集合中。父節點再入棧。到3)
9)判斷當前節點是否還有父節點(即判斷nodeList中是否還有id為當前節點pid的節點),若有,到10),否則到11)
10)取出該節點為pNode,並將pNode從nodeList中刪除,將當前節點cNode加入到pNode的children集合中,
即作為父節點的孩子節點,父節點入棧(父節點還可能有別的孩子結點)。到3)
11)表示當前節點為頂級節點,將其直接加入到root的children中。到3)
因為每找到一個子節點均將齊從nodelist中移除,故當前節點的子節點最終都會找完
exit)程序結束。此時返回的root節點即為完整的多叉樹的根節點,可通過其孩子集合來對節點進行訪問,並
通過json的方法進行樹形數據格式的轉換。

 

public class TreeNodeHelper
{
    /// <summary>
    /// 生成一個根節點的樹
    /// </summary>
    /// <param name="nodeList">節點列表,包含未連接的樹節點,節點中給出id,pid,text字段</param>
    /// <returns></returns>
    public TreeNode GenerateTreeRoot(List<TreeNode> nodeList)
    {
        TreeNode root = new TreeNode();
        TreeNode cNode;
        TreeNode chNode;
        TreeNode pNode;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(nodeList.Count>0)
        {
            cNode = nodeList[0];
            nodeList.Remove(cNode);
            stack.Push(cNode);
            while (cNode != null)
            {
                cNode = stack.Pop();
                if ((chNode = getChildren(cNode, nodeList)) != null)
                {
                    stack.Push(cNode);
                    nodeList.Remove(chNode);
                    stack.Push(chNode);
                }
                else
                {
                    if (stack.Count > 0)
                    {
                        pNode = stack.Pop();
                        pNode.Children.Add(cNode);    

                        stack.Push(pNode);
                    }
                    else
                    {
                        if((pNode=getParent(cNode,nodeList))!=null)
                        {
                            nodeList.Remove(pNode);
                            stack.Push(pNode);
                            pNode.Children.Add(cNode);
                        }
                        else
                        {
                            root.Children.Add(cNode);
                            cNode = null;
                        }
                    }
                }
            }
        }
        return root;
    }

    public TreeNode getChildren(TreeNode node, List<TreeNode> list)
    {
        return list.Find(delegate(TreeNode n) { return n.Pid == node.Id; });
    }
    public TreeNode getParent(TreeNode node, List<TreeNode> list)
    {
        return list.Find(delegate(TreeNode n) { return n.Id == node.Pid; });
    }
}
 

下面是節點類的定義:

public class TreeNode
{
    public TreeNode()
    {
        m_Id = String.Empty;
        m_Pid = String.Empty;
        m_Text = String.Empty;
        m_Children = new List<TreeNode>();
    }

    public TreeNode(string id, string pid, string text)
    {
        m_Id = id;
        m_Pid = pid;
        m_Text = text;
        m_Children = new List<TreeNode>();
    }

    private string m_Id;
    public string Id
    {
        get { return m_Id; }
        set { m_Id = value; }
    }

    private string m_Pid;
    public string Pid
    {
        get { return m_Pid; }
        set { m_Pid = value; }
    }

    private string m_Text;
    public string Text
    {
        get { return						

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved