日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(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ā)表評論 來源:本站原創(chuàng)時間:2010/3/20 0:10:27字體大。A-A+

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

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

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

      算法思想如下:
      1)當(dāng)nodelist中還有節(jié)點(diǎn)存在時,取出nodeList中的一個節(jié)點(diǎn),并將其從nodeList中移除,進(jìn)行2)
      2)采用深度遍歷算法,每取一個節(jié)點(diǎn),將其壓入堆棧,因?yàn)閚odelist中不包含根節(jié)點(diǎn),故建立一個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)此時,判斷堆棧是否為空,若為空(表示此時當(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)為頂級節(jié)點(diǎn),將其直接加入到root的children中。到3)
      因?yàn)槊空业揭粋子節(jié)點(diǎn)均將齊從nodelist中移除,故當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)最終都會找完
      exit)程序結(jié)束。此時返回的root節(jié)點(diǎn)即為完整的多叉樹的根節(jié)點(diǎn),可通過其孩子集合來對節(jié)點(diǎn)進(jìn)行訪問,并
      通過json的方法進(jìn)行樹形數(shù)據(jù)格式的轉(zhuǎn)換。

       

      public class TreeNodeHelper
      {
          /// <summary>
          /// 生成一個根節(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)時添加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();
          }
      }
        代碼寫的比較菜,歡迎扔磚,共同進(jìn)步

        相關(guān)評論

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

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

        熱門評論

        最新評論

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

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