• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

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

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

    相關軟件相關文章發表評論 來源:本站原創時間:2010/3/20 0:10:27字體大?。?em class="fontsize">A-A+

    作者:佚名點擊:940次評論:0次標簽: ajax

    • 類型:編程控件大?。?i>6.8M語言:中文 評分:2.5
    • 標簽:
    立即下載

    當時想這個算法的時候,是先想好了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 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>
        /// 生成根節點的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("',");
                //有孩子節點時添加children字段,否則令leaf字段為true
                if (node.HasChildren)
                {
                    sb.Append("'children':");
                    sb.Append(node.ToJsonTreeString());
                }
                else
                {
                    sb.Append("'leaf':true");
                }
                sb.Append("},");
            }
            //去掉最后一個逗號
            if(this.Children.Count>0)
                sb.Remove(sb.ToString().LastIndexOf(','), 1);
            sb.Append("]");
            return sb.ToString();
        }
    }
      代碼寫的比較菜,歡迎扔磚,共同進步

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

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

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>