西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)C#.NET → 用C#實(shí)現(xiàn)多叉樹的生成并轉(zhuǎn)化為extjs(基于js腳本的ajax UI框架)的TreeNode的json數(shù)據(jù)格式(格式為Id,Pid,Text)

用C#實(shí)現(xiàn)多叉樹的生成并轉(zhuǎn)化為extjs(基于js腳本的ajax UI框架)的TreeNode的json數(shù)據(jù)格式(格式為Id,Pid,Text)

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:本站原創(chuàng)時(shí)間:2010/3/20 0:10:27字體大。A-A+

作者:佚名點(diǎn)擊:940次評(píng)論:0次標(biāo)簽: ajax

  • 類型:編程控件大。6.8M語言:中文 評(píng)分:2.5
  • 標(biāo)簽:
立即下載

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

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

 

public class TreeNodeHelper
{
    /// <summary>
    /// 生成一個(gè)根節(jié)點(diǎn)的樹
    /// </summary>
    /// <param name="nodeList">節(jié)點(diǎn)列表,包含未連接的樹節(jié)點(diǎn),節(jié)點(diǎn)中給出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; });
    }
}
 

下面是節(jié)點(diǎn)類的定義:

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 m_Text; }
        set { m_Text = value; }
    }
    private List<TreeNode> m_Children;
    public List<TreeNode> Children
    {
        get { return m_Children; }
        set { m_Children = value; }
    }
    public bool HasChildren 
    {
        get {
            if (this.Children != null)
                return m_Children.Count > 0 ? true : false;
            else
                return false;
        }
    }

    /// <summary>
    /// 生成根節(jié)點(diǎn)的json格式字符串
    /// </summary>
    /// <returns></returns>
    public string ToJsonTreeString()
    {
        if (!this.HasChildren)
            return "";
        StringBuilder sb = new StringBuilder();
        sb.Append("[");
        foreach (TreeNode node in this.Children)
        {
            sb.Append("{");
            sb.Append("'id':'");
            sb.Append(node.Id);
            sb.Append("','text':'");
            sb.Append(node.Text);
            sb.Append("',");
            //有孩子節(jié)點(diǎn)時(shí)添加children字段,否則令leaf字段為true
            if (node.HasChildren)
            {
                sb.Append("'children':");
                sb.Append(node.ToJsonTreeString());
            }
            else
            {
                sb.Append("'leaf':true");
            }
            sb.Append("},");
        }
        //去掉最后一個(gè)逗號(hào)
        if(this.Children.Count>0)
            sb.Remove(sb.ToString().LastIndexOf(','), 1);
        sb.Append("]");
        return sb.ToString();
    }
}
  代碼寫的比較菜,歡迎扔磚,共同進(jìn)步

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)